OAuth: কিভাবে ইউজার ডাটাকে সুরক্ষা করে

টিউন বিভাগ অন্যান্য
প্রকাশিত
জোসস করেছেন

Introduction

OAuth একটি authorization framework যেটা একটি অ্যাপ্লিকেশনকে একটি http service (যেমন, Facebook, Google, or your own oauth service) এর ইউজার একাউন্টের সীমিত অ্যাকসেস দেয়। এটি ইউজার একাউন্ট যে সার্ভিসে হোস্ট আছে তার প্রতিনিধি হিসাবে কাজ করে এবং third party application কে ইউজার একাউন্টের অ্যাকসেস দেওয়ার জন্য authorized করে।

OAuth সম্পর্কে জানার জন্য আমরা OAuth roles, grant types, use cases এবং flows নিয়ে আলোচনা করবো।

OAuth Roles

OAuth ৪ টা roles কে define করে:

  • Resource Owner
  • Authorization Server
  • Resource Server
  • Client

Let’s see what’s going on in these following roles.

Resource Owner

Resource Owner একজন ইউজার যে একটি অ্যাপ্লিকেশনকে তার একাউন্ট ব্যবহার করার অনুমতি দেয়। ইউজার একাউন্টে application এর অ্যাকসেস সাধারণত “scope” দ্বারা সীমাবদ্ধ থাকে।

Resource / Authorization Server: API

Resource Server ইউজার একাউন্টকে হোস্ট করে, মনে একজন ইউজারের বিস্তারিত ইনফরমেশন Resource Server থাকে এবং Authorization Server একজন ইউজারের আইডেন্টিটি ভেরিফাই করে অ্যাপ্লিকেশনের জন্য access token তৈরি করে।

Client: Application

Client হল সেই অ্যাপ্লিকেশন যে ইউজার একাউন্টের অ্যাকসেস চায়। কিন্তু তার আগে অবশ্যই ইউজারকে এই অ্যাপ্লিকেশনকে authorized করতে হবে এবং এই authorization অবশ্যই Authorization Server দ্বারা validate হতে হবে।

Abstract Protocol flow

আমাদের এখন OAuth roles সম্পর্কে কিছুটা আইডিয়া হয়েছে, so let’s see how they interact with each other:

  1. অ্যাপ্লিকেশন, ইউজারের কাছে ইউজার রিসোর্সের অ্যাকসেস পাবার জন্য request করবে।
  2. যদি ইউজার request authorized করে তাহলে অ্যাপ্লিকেশন authorization grant রিসিভ করবে।
  3. অ্যাপ্লিকেশন Authorization Server কাছে তার নিজের আইডেন্টিটি এবং authorization grant দিয়ে একটি access token চাবে।
  4. যদি অ্যাপ্লিকেশনের আইডেন্টিটি ঠিক থাকে এবং authorization grant valid হয় তাহলে Authorization Server অ্যাপ্লিকেশনের জন্যে একটি access token দিবে।
  5. Application এই access token দিয়ে Resource Server থেকে ইউজারের রিসোর্স অ্যাকসেস করবে।

উপরের flow টি authorization grant types এর উপর ভিত্তি করে আলাদা হয়, but this is the general idea।

Application Registration

অ্যাপ্লিকেশন OAuth ইউজ করার আগে অ্যাপ্লিকেশনটিকে অবশ্যই OAuth service এর সঙ্গে রেজিস্টার থাকতে হবে। একটি অ্যাপ্লিকেশন সাধারণত নিচের তথ্য দিয়ে সার্ভিসে রেজিঃ করে:

  • Application Name
  • Application Website
  • Redirect URI or Callback URL
  • অন্যান্য

OAuth service ইউজারকে Redirect URL কাছে রেডিরেক্ট করবে যদি ইউজার অ্যাপ্লিকেশনকে authorized or deny করে।

Client ID এবং Client Secret

যখন অ্যাপ্লিকেশন OAuth সার্ভিসের সাথে রেজিঃ করে, OAuth সার্ভিস অ্যাপ্লিকেশনের জন্য Client Identifier এবং Client Secret তৈরি করে যেটা Client Credentials হিসাবে ব্যবহার করা হয়। Client Id একটি string যেটা সকলের জন্য উন্মুক্ত থাকে (publicly expose string), এবং এটির মাধ্যমে OAuth সার্ভিস অ্যাপ্লিকেশনকে আইডেন্টিফাই করে অথবা চিনে থাকে। আর Client Secret ব্যবহার করে OAuth সার্ভিস অ্যাপ্লিকেশনের identity authenticate করে যখন অ্যাপিকেশন ইউজারের একাউন্ট ব্যবহার করতে চায়। Client Secret অ্যাপ্লিকেশন এবং OAuth সার্ভিসের মধ্যে ‘privately’ রাখা হয়।

Authorization Grant

অ্যাপ্লিকেশন কি রকম রিকোয়েস্ট করছে এবং OAuth সার্ভিস কি কি grant types সাপোর্ট করে তার উপর Authorization grant type নির্ভর করে। OAuth ৪টি geant types define করে:

  • Authorization Code: সাধারণত server-side অ্যাপ্লিকেশনের ক্ষেত্রে ব্যবহার করা হয়।
  • Implicit: এটি নিয়ে এখানে আলোচনা হবে না।
  • Resource Owner Password Credentials: Trusted অ্যাপ্লিকেশনের ক্ষেত্রে ব্যবহার করা হয়, যেমন যে সব অ্যাপ্লিকেশন OAuth অথবা সার্ভিসের এর নিজের।
  • Client Credentials: অ্যাপ্লিকেশন নিজের API অথবা সার্ভিস অ্যাকসেস করার ক্ষেত্রে এটি ব্যবহার করা হয়।

আমরা এখন grant types আরো ডিটেইল, তাদের ব্যবহার এবং flow সম্পর্কে জানবো।

Grant Type: Authorization Code

Authorization Code grant type সাধারণত সার্ভার সাইড অ্যাপের জন্য ব্যবহার করা হয়, যেখানে source code publicly expose থাকে না, এবং Client Secret এর confidentiality রক্ষা করা যায়। এটি একটি redirection-based flow, সুতরাং অ্যাপ্লিকেশনকে অবশ্যই user-agent যেমন ইউজার ওয়েব ব্রাউজারের সাথে interact এবং authorization code রিসিভ করার সক্ষমতা থাকতে হবে। OAuth service authorization code কে user-agent মাধ্যমে routed করে থাকে।

Step 1: Authorization Code Link

প্রথমে, ইউজারের কাছে একটি authorization code link যাবে যেটা দেখতে নিম্নোক্ত হতে পারে:

https://authserverURL/api/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
  • https://authserverURL/api/v1/oauth/authorize: এটি API authorization endpoint
  • client_id=CLIENT_ID: এটি অ্যাপের client ID, যেটি দিয়ে API or OAuth application কে আইডেন্টিফাই করবে
  • redirect_uri=CALLBACK_URL: User application কে authorized করলে OAuth সার্ভিস user-agent (browser) কে authorization code সহ এই URL redirect করবে
  • response_type=code: এটি দ্বারা OAuth সার্ভিস বুঝতে পারবে অ্যাপটি authorization code এর জন্য request করেছে
  • scope=read: অ্যাপটি কোন লেভেলের অ্যাকসেস চাচ্ছে এটি দ্বারা সেটি নির্ধারিত করা যাবে

Step 2: User Authorizes Application

যখন ইউজার লিংকটি ক্লিক করবে, তখন তাকে অবশ্যই সার্ভিসে লগইন করতে হবে, যাতে ইউজারের আইডেন্টিটি ভেরিফাই করা যায় (যদি না ইউজার ইতিমধ্যে লগইন করা না থাকে)। এরপর OAuth সার্ভিস ইউজারের কাছে একটি promoted মাধ্যমে জানতে চাইবে সে কি অ্যাপটিকে তার একাউন্ট অ্যাকসেস করার জন্য authorize অথবা deny করবে।

Google prompt to authorized an app
Google prompt to authorized an app

Step 3: Application Receives Authorization code

ইউজার যদি অ্যাপটিকে authorized করে, তাহলে OAuth সার্ভিস user-agent/web browser কে একটি authorization code সহ অ্যাপটির redirect URI তে redirect করবে।

An example redirect URL might look like this:

https://appRedirectURI/callback?code=AUTHORIZATION_CODE

Step 4: Application Requests Access Token

এরপর অ্যাপটি API/OAuth service কাছে একটি access token এর জন্য API token endpoint এর কাছে request করবে। এই রিকোয়েস্টের সাথে অ্যাপটি authorization code এবং তার authentication details (Client ID এবং Client Secret) প্রদান করবে। An example POST request might look like this:

https://authserverURL/api/v1/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

Step 5: Application Receives Access Token

Authorization যদি ঠিক থাকে, তাহলে OAuth service অ্যাপটির কাছে access token (optionally, একটি refresh token) সহ একটি response পাঠাবে। The response might look like this:

{"access_token": "ACCESS_TOKEN", "token_type": "bearer", "expires_in": 2592000, "refresh_token": "REFRESH_TOKEN"}

এখন অ্যাপ্লিকেশনটি authorized। সুতরাং অ্যাপটি এই access token দিয়ে ইউজারের একাউন্ট অ্যাকসেস করতে পারবে, যতক্ষণ না access token expires অথবা revoked হবে। যদি রেসপন্সে refresh token দেওয়া হয়, তবে অ্যাপটি এটি ব্যবহার করে নতুন access token নিতে পারবে যদি অরিজিনাল token expires হয়ে যায়।

Grant Type: implicit

We will discuss about this flow in my next post.

Grant Type: Resource Owner Password Credentials

এই grant type এ, user তার credentials (username এবং password) সরাসরি অ্যাপ্লিকেশনকে দিয়ে থাকে যার মাধ্যমে অ্যাপটি OAuth সার্ভিস থেকে access token নিতে পারে। এই grant type শুধুমাত্র ট্রাস্টেড অ্যাপ্লিকেশনের (যেমন, OAuth সার্ভিসের নিজের অ্যাপ্লিকেশন) জন্য ব্যবহার করা উচিত।

The POST request might look like this:

https://authserverURL/api/v1/oauth/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

Grant Type: Client Credentials

একটি অ্যাপ্লিকেশন যদি তার নিজের সার্ভিস একাউন্ট অ্যাকসেস করতে চায় সেইক্ষেত্রে এই grant type ব্যবহার করা হয়। যেমন, অ্যাপটি তার অ্যাপ description অথবা redirectURI অথবা অন্য কোন ইনফো আপডেট করতে চায়।

An example POST request might look like this:

https://authserverURL/api/v1/oauth/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

Use An Access Token:

অ্যাপ্লিকেশনের কাছে যদি access token থাকে তাহলে অ্যাপটি ইউজার একাউন্ট API মাধ্যমে অ্যাকসেস করতে পারবে।

A request, using curl, to obtain user details might look like this:

curl -X GET -H "Authorization: Bearer ACCESS_TOKEN" "https://authserverURL/api/v1/users/info"

Conclusion:

আশাকরি, OAuth flow সম্পর্কে আপনারা কিছুটা হলেও জানতে পেরেছেন যদিও আমি OAuth সম্পর্কে সম্পূর্ণ বিস্তারিত বলতে পারিনি। আমি আমার পরবর্তি আর্টিকেলে OAuth সম্পর্কে আরো বিস্তারিত বলার চেষ্টা করবো। Until then, happy coding.

Level 0

আমি ফাহিম রহমান। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 6 বছর 4 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 2 টি টিউন ও 0 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস