API Authentication এবং Authorization হলো সিকিউরিটি ফিচার, যা ওয়েব অ্যাপ্লিকেশনে ব্যবহারকারী বা ক্লায়েন্টদের সঠিকভাবে শনাক্ত করতে এবং তাদের অনুমোদিত অ্যাকশনগুলোর উপর নিয়ন্ত্রণ রাখতে ব্যবহৃত হয়। Ruby on Rails-এ এই ফিচার দুটি কার্যকরভাবে ব্যবহার করতে বিভিন্ন পদ্ধতি রয়েছে। এখানে আমরা Authentication এবং Authorization এর মধ্যে পার্থক্য, এবং Rails-এ এগুলি বাস্তবায়ন করার উপায় নিয়ে আলোচনা করবো।
Authentication এবং Authorization এর পার্থক্য
- Authentication: এটি প্রক্রিয়া যার মাধ্যমে সিস্টেম নিশ্চিত করে যে ব্যবহারকারী বা ক্লায়েন্ট যে ব্যক্তি বা সত্ত্বা হিসেবে দাবি করছে, সেটিই। সাধারণত, এটি login বা token-based সিস্টেমের মাধ্যমে বাস্তবায়িত হয়।
- Authorization: এটি নিশ্চিত করে যে একটি অটেন্টিকেটেড (প্রমাণীকৃত) ব্যবহারকারী কী কাজ করতে পারে। অর্থাৎ, একজন ব্যবহারকারী নির্দিষ্ট একটি রিসোর্স বা অ্যাকশনের জন্য অনুমোদিত কি না, সেটি যাচাই করা হয়।
Rails-এ সাধারণত Authentication এর জন্য JWT (JSON Web Tokens) বা Devise ব্যবহৃত হয়, এবং Authorization এর জন্য Pundit বা CanCanCan এর মতো গেম লাইব্রেরি ব্যবহার করা হয়।
API Authentication in Ruby on Rails
API Authentication সাধারণত টোকেন ভিত্তিক হয়। এটি API রিকোয়েস্টে একটি ইউনিক টোকেন পাঠানোর মাধ্যমে ব্যবহারকারী বা ক্লায়েন্টের পরিচয় শনাক্ত করে। Rails-এ API Authentication কার্যকরভাবে সেট আপ করার জন্য জনপ্রিয় দুটি পদ্ধতি হলো JWT Authentication এবং Devise Token Auth।
১. JWT Authentication
JWT (JSON Web Token) একটি ওপেন স্ট্যান্ডার্ড, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদভাবে তথ্য শেয়ার করতে ব্যবহৃত হয়। Rails-এ JWT Authentication ব্যবহার করার জন্য কিছু সাধারণ পদক্ষেপ নিচে আলোচনা করা হলো।
Step 1: gem 'jwt' ইন্সটল করা
প্রথমে, আপনার Gemfile এ jwt জেমটি যোগ করুন:
gem 'jwt'
এরপর bundle install চালান।
Step 2: Authentication Controller তৈরি করা
আপনি একটি AuthenticationController তৈরি করতে পারেন, যা রিসিভ করা হবে email ও password দিয়ে এবং JWT টোকেন রিটার্ন করবে।
class AuthenticationController < ApplicationController
def login
user = User.find_by(email: params[:email])
if user && user.authenticate(params[:password])
token = encode_token(user_id: user.id)
render json: { token: token }, status: :ok
else
render json: { error: 'Invalid credentials' }, status: :unauthorized
end
end
private
def encode_token(payload)
JWT.encode(payload, Rails.application.secret_key_base)
end
end
এখানে, encode_token মেথডে JWT টোকেন তৈরি করা হচ্ছে এবং login মেথডে ব্যবহারকারীর email ও password যাচাই করা হচ্ছে। যদি সঠিক হয়, তবে JWT টোকেন রিটার্ন হবে।
Step 3: Token Verification Middleware তৈরি করা
টোকেন যাচাইয়ের জন্য একটি middleware তৈরি করতে হবে, যা API রিকোয়েস্টের মধ্যে Authorization হেডারে পাঠানো JWT টোকেন যাচাই করবে।
class ApplicationController < ActionController::API
def authenticate_request
begin
@decoded = JWT.decode(request.headers['Authorization'].split(' ').last, Rails.application.secret_key_base)
@current_user = User.find(@decoded[0]['user_id'])
rescue JWT::DecodeError
render json: { error: 'Not Authenticated' }, status: :unauthorized
end
end
end
এখানে, authenticate_request মেথডটি Authorization হেডারে পাঠানো JWT টোকেনকে ডিকোড করে এবং ব্যবহারকারীকে শনাক্ত করে। যদি টোকেন বৈধ না হয়, তবে unauthorized স্ট্যাটাস রিটার্ন করা হবে।
Step 4: Token Authentication এর মাধ্যমে রিসোর্স প্রটেক্ট করা
এখন আপনি যেকোনো রিসোর্সে authenticate_request মেথডটি ব্যবহার করে প্রমাণীকরণের প্রয়োজনে প্রোটেক্ট করতে পারেন।
class ProductsController < ApplicationController
before_action :authenticate_request
def index
products = Product.all
render json: products
end
end
এটি ProductsController এর সব অ্যাকশনের জন্য JWT টোকেন যাচাই করবে। শুধুমাত্র বৈধ টোকেন সহ রিকোয়েস্ট আসলে ডেটা রিটার্ন হবে।
API Authorization in Ruby on Rails
Authorization নিশ্চিত করে যে একজন ব্যবহারকারী নির্দিষ্ট রিসোর্স বা অ্যাকশনে অ্যাক্সেস পেতে পারবেন কিনা। Rails-এ সাধারণত Pundit বা CanCanCan লাইব্রেরি ব্যবহার করা হয়।
২. Pundit Authorization
Pundit একটি গেম লাইব্রেরি, যা রোল-বেসড বা পলিসি-বেসড অনুমোদন বাস্তবায়ন করতে সাহায্য করে। এটি একটি সহজ এবং পরিষ্কার উপায়ে আপনার অ্যাপ্লিকেশনের অনুমোদন ব্যবস্থা তৈরি করতে পারে।
Step 1: gem 'pundit' ইন্সটল করা
প্রথমে আপনার Gemfile-এ pundit জেমটি যোগ করুন:
gem 'pundit'
তারপর bundle install চালান।
Step 2: Pundit Policy তৈরি করা
ধরা যাক, আপনার Product রিসোর্স রয়েছে, এবং আপনি চান যে শুধুমাত্র অনুমোদিত ব্যবহারকারীরা পণ্য দেখতে পারবে। তাহলে প্রথমে একটি Policy ক্লাস তৈরি করতে হবে।
# app/policies/product_policy.rb
class ProductPolicy < ApplicationPolicy
def show?
user.admin? || user == record.user
end
end
এখানে, show? মেথডে আমরা চেক করছি যে, ব্যবহারকারী admin কি না অথবা পণ্যটির মালিক কি না।
Step 3: Controller এ Authorization ব্যবহার করা
আপনি আপনার কন্ট্রোলারে authorize মেথডটি ব্যবহার করে ব্যবহারকারীর অনুমোদন চেক করতে পারেন।
class ProductsController < ApplicationController
before_action :authenticate_request
before_action :set_product, only: [:show]
def show
authorize @product
render json: @product
end
private
def set_product
@product = Product.find(params[:id])
end
end
এখানে, authorize @product মেথডটি ProductPolicy ক্লাসের show? মেথডটিকে কল করে অনুমোদন চেক করবে। যদি ব্যবহারকারী অনুমোদিত না হন, তাহলে এটি 403 Forbidden রেসপন্স ফেরত দিবে।
সারমর্ম
Ruby on Rails-এ API Authentication এবং Authorization ব্যবস্থাপনা সিকিউরিটি নিশ্চিত করতে অত্যন্ত গুরুত্বপূর্ণ। Authentication এর জন্য সাধারণত JWT বা Devise Token Auth ব্যবহার করা হয়, যেখানে ব্যবহারকারীরা তাদের পরিচয় প্রমাণ করতে একটি টোকেন পেয়ে থাকে। অন্যদিকে, Authorization নিশ্চিত করতে Pundit বা CanCanCan ব্যবহার করা হয়, যা রিসোর্স ভিত্তিক অনুমোদন প্রদান করে। এই দুটি প্রক্রিয়া একসাথে ব্যবহার করে আপনি একটি নিরাপদ এবং স্কেলেবল API তৈরি করতে পারবেন।
Read more