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 করে:
Let’s see what’s going on in these following roles.
Resource Owner একজন ইউজার যে একটি অ্যাপ্লিকেশনকে তার একাউন্ট ব্যবহার করার অনুমতি দেয়। ইউজার একাউন্টে application এর অ্যাকসেস সাধারণত “scope” দ্বারা সীমাবদ্ধ থাকে।
Resource Server ইউজার একাউন্টকে হোস্ট করে, মনে একজন ইউজারের বিস্তারিত ইনফরমেশন Resource Server থাকে এবং Authorization Server একজন ইউজারের আইডেন্টিটি ভেরিফাই করে অ্যাপ্লিকেশনের জন্য access token তৈরি করে।
Client হল সেই অ্যাপ্লিকেশন যে ইউজার একাউন্টের অ্যাকসেস চায়। কিন্তু তার আগে অবশ্যই ইউজারকে এই অ্যাপ্লিকেশনকে authorized করতে হবে এবং এই authorization অবশ্যই Authorization Server দ্বারা validate হতে হবে।
Abstract Protocol flow
আমাদের এখন OAuth roles সম্পর্কে কিছুটা আইডিয়া হয়েছে, so let’s see how they interact with each other:
উপরের flow টি authorization grant types এর উপর ভিত্তি করে আলাদা হয়, but this is the general idea।
Application Registration
অ্যাপ্লিকেশন OAuth ইউজ করার আগে অ্যাপ্লিকেশনটিকে অবশ্যই OAuth service এর সঙ্গে রেজিস্টার থাকতে হবে। একটি অ্যাপ্লিকেশন সাধারণত নিচের তথ্য দিয়ে সার্ভিসে রেজিঃ করে:
OAuth service ইউজারকে Redirect URL কাছে রেডিরেক্ট করবে যদি ইউজার অ্যাপ্লিকেশনকে authorized or deny করে।
যখন অ্যাপ্লিকেশন 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 করে:
আমরা এখন 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 করে থাকে।
প্রথমে, ইউজারের কাছে একটি authorization code link যাবে যেটা দেখতে নিম্নোক্ত হতে পারে:
https://authserverURL/api/v1/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
যখন ইউজার লিংকটি ক্লিক করবে, তখন তাকে অবশ্যই সার্ভিসে লগইন করতে হবে, যাতে ইউজারের আইডেন্টিটি ভেরিফাই করা যায় (যদি না ইউজার ইতিমধ্যে লগইন করা না থাকে)। এরপর OAuth সার্ভিস ইউজারের কাছে একটি promoted মাধ্যমে জানতে চাইবে সে কি অ্যাপটিকে তার একাউন্ট অ্যাকসেস করার জন্য authorize অথবা deny করবে।
ইউজার যদি অ্যাপটিকে 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
এরপর অ্যাপটি 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
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"
আশাকরি, OAuth flow সম্পর্কে আপনারা কিছুটা হলেও জানতে পেরেছেন যদিও আমি OAuth সম্পর্কে সম্পূর্ণ বিস্তারিত বলতে পারিনি। আমি আমার পরবর্তি আর্টিকেলে OAuth সম্পর্কে আরো বিস্তারিত বলার চেষ্টা করবো। Until then, happy coding.
আমি ফাহিম রহমান। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 6 বছর 4 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 2 টি টিউন ও 0 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।