আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন দেখুন। তথ্য
এই বিষয়ে Apigee Edge-এ OAuth 2.0 স্কোপ কীভাবে ব্যবহার করতে হয় তা আলোচনা করা হয়েছে।
OAuth2 স্কোপ কী?
OAuth 2.0 স্কোপ, অ্যাক্সেস টোকেনকে দেওয়া অ্যাক্সেসের পরিমাণ সীমিত করার একটি উপায় প্রদান করে। যেমন, কোনও ক্লায়েন্ট অ্যাপকে ইস্যু করা অ্যাক্সেস টোকেন, সুরক্ষিত রিসোর্সে READ ও WRITE অ্যাক্সেস অথবা শুধু READ অ্যাক্সেস দিতে পারে। আপনি যে স্কোপ বা স্কোপের কম্বিনেশন প্রয়োগ করতে চান, তার জন্য API প্রয়োগ করতে পারবেন। তাই, কোনও ক্লায়েন্ট যদি READ স্কোপ সহ টোকেন পায় এবং সেটি WRITE অ্যাক্সেস প্রয়োজন এমন কোনও API এন্ডপয়েন্ট কল করার চেষ্টা করে, তাহলে কলটি ব্যর্থ হবে।
এই বিষয়ে, আমরা আলোচনা করব কীভাবে অ্যাক্সেস টোকেনে স্কোপ অ্যাসাইন করা হয় এবং কীভাবে Apigee Edge OAuth 2.0 স্কোপ প্রয়োগ করে। এই বিষয় পড়ার পরে, আপনি আত্মবিশ্বাসের সাথে স্কোপ ব্যবহার করতে পারবেন।
অ্যাক্সেস টোকেনে কীভাবে স্কোপ অ্যাসাইন করা হয়?
Edge কোনও অ্যাক্সেস টোকেন তৈরি করলে, সেটি সেই টোকেনে কোনও স্কোপ অ্যাসাইন করতে পারে। এটি কীভাবে হয় তা বুঝতে, আপনাকে প্রথমে এইসব Apigee Edge এন্টিটি সম্পর্কে জানতে হবে: API প্রোডাক্ট, ডেভেলপার এবং ডেভেলপার অ্যাপ। ভূমিকা পেতে, প্রকাশনা সম্পর্কে ভূমিকা দেখুন। আমরা সাজেস্ট করি যে চালিয়ে যাওয়ার আগে আপনার প্রয়োজন হলে এই মেটেরিয়াল পর্যালোচনা করে নিন।
অ্যাক্সেস টোকেন হল এলোমেলো দেখতে অক্ষরের একটি দীর্ঘ স্ট্রিং যা Edge-কে ইনকামিং API অনুরোধ যাচাই করতে দেয় (এটি সাধারণ ইউজারনেম/পাসওয়ার্ড ক্রেডেনশিয়ালের বিকল্প হিসেবে কাজ করে)। টেকনিক্যালি, টোকেন হল একটি কী যা মেটাডেটার একটি সংগ্রহকে বোঝায় যা এইরকম দেখতে হয়:
{ "issued_at" : "1416962591727", "application_name" : "0d3e1d41-a59f-4d74-957e-d4e3275d4781", "scope" : "A", "status" : "approved", "api_product_list" : "[scopecheck1-bs0cSuqS9y]", "expires_in" : "1799", //--in seconds "developer.email" : "scopecheck1-AdBmANhsag@apigee.com", "organization_id" : "0", "token_type" : "BearerToken", "client_id" : "eTtB7w5lvk3DnOZNGReBlvGvIAeAywun", "access_token" : "ODm47ris5AlEty8TDc1itwYPe5MW", "organization_name" : "wwitman", "refresh_token_expires_in" : "0", //--in seconds "refresh_count" : "0" }
টোকেনের মেটাডেটাতে আসল অ্যাক্সেস টোকেন স্ট্রিং, মেয়াদ শেষ হওয়ার তথ্য, ডেভেলপার অ্যাপ, ডেভেলপার এবং টোকেনের সাথে যুক্ত প্রোডাক্টের শনাক্তকরণ অন্তর্ভুক্ত। এছাড়াও, আপনি লক্ষ্য করবেন যে মেটাডেটাতে "স্কোপ"ও অন্তর্ভুক্ত আছে।
টোকেন কীভাবে তার স্কোপ পায়?
স্কোপ বোঝার প্রথম চাবিকাঠি হল, মনে রাখতে হবে যে ডেভেলপার অ্যাপের প্রতিটি প্রোডাক্টে শূন্য বা একাধিক স্কোপ অ্যাসাইন করা থাকতে পারে। প্রোডাক্ট তৈরি করার সময় এইসব স্কোপ অ্যাসাইন করা যেতে পারে অথবা পরে যোগ করা যেতে পারে। এগুলি নামের তালিকা হিসেবে থাকে এবং প্রতিটি প্রোডাক্টের সাথে যুক্ত "মেটাডেটাতে" অন্তর্ভুক্ত থাকে।
আপনি কোনও ডেভেলপার অ্যাপ তৈরি করে তাতে প্রোডাক্ট যোগ করলে, Edge ডেভেলপার অ্যাপের সব প্রোডাক্ট চেক করে এবং সেইসব প্রোডাক্টের জন্য সব স্কোপের একটি তালিকা তৈরি করে (অ্যাপের মাস্টার বা গ্লোবাল স্কোপের তালিকা -- সব স্বীকৃত স্কোপের একটি ইউনিয়ন)।
কোনও ক্লায়েন্ট অ্যাপ Apigee Edge-এর থেকে অ্যাক্সেস টোকেনের অনুরোধ করলে, সেটি ঐচ্ছিকভাবে উল্লেখ করতে পারে যে কোন স্কোপ সে ওই টোকেনের সাথে যুক্ত করতে চায়। যেমন, নিম্নলিখিত অনুরোধটি "A" স্কোপের জন্য জিজ্ঞাসা করে। অর্থাৎ, ক্লায়েন্ট অনুরোধ করছে যে অনুমোদন সার্ভার (Edge) যেন এমন একটি অ্যাক্সেস টোকেন তৈরি করে যার স্কোপ "A" (এর ফলে অ্যাপটি "A" স্কোপ থাকা API-কে কল করার অনুমোদন পাবে)। অ্যাপটি এই ধরনের একটি POST অনুরোধ পাঠায়:
curl -i -X POST -H Authorization: Basic Mg12YTk2UkEIyIBCrtro1QpIG -H content-type:application/x-www-form-urlencoded http://myorg-test.apigee.net/oauth/token?grant_type=client_credentials&scope=A
কী হয়?
Edge এই অনুরোধটি পেলে, কোন অ্যাপ অনুরোধ করছে তা বুঝতে পারে এবং কোন
ডেভেলপার অ্যাপে ক্লায়েন্ট রেজিস্টার করেছে তাও বুঝতে পারে (ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট কীগুলি
বেসিক অথ হেডার এনকোড করা থাকে)। scope কোয়েরি প্যারামিটার অন্তর্ভুক্ত থাকার কারণে, Edge-কে
সিদ্ধান্ত নিতে হবে যে ডেভেলপার অ্যাপের সাথে যুক্ত কোনও API প্রোডাক্টের স্কোপ "A" আছে কিনা। যদি তারা তা করে,
তাহলে "A" স্কোপ সহ একটি অ্যাক্সেস টোকেন তৈরি করা হয়। এটি দেখার আরেকটি উপায় হল যে স্কোপ
কোয়েরি প্যারামিটার হল এক ধরনের ফিল্টার। ডেভেলপার অ্যাপ যদি "A, B, X" স্কোপ শনাক্ত করে এবং কোয়েরি প্যারামিটার যদি "scope=X Y Z" উল্লেখ করে, তাহলে টোকেনকে
শুধুমাত্র "X" স্কোপ অ্যাসাইন করা হবে।
ক্লায়েন্ট স্কোপ প্যারামিটার অ্যাটাচ না করলে কী হবে? এই ক্ষেত্রে, Edge একটি টোকেন তৈরি করে যেটিতে ডেভেলপার অ্যাপের শনাক্ত করা সব স্কোপ অন্তর্ভুক্ত থাকে। এটি বোঝা গুরুত্বপূর্ণ যে ডিফল্ট আচরণ হল এমন একটি অ্যাক্সেস টোকেন রিটার্ন করা যাতে ডেভেলপার অ্যাপে অন্তর্ভুক্ত সব প্রোডাক্টের জন্য সব স্কোপের ইউনিয়ন থাকে।
ডেভেলপার অ্যাপের সাথে যুক্ত কোনও প্রোডাক্টে স্কোপ নির্দিষ্ট করা না থাকলে এবং টোকেনে স্কোপ থাকলে সেই টোকেন দিয়ে কল করা যাবে না।
ধরা যাক, কোনও ডেভেলপার অ্যাপ এইসব স্কোপ শনাক্ত করে: A B C D. এটি হল স্কোপের
অ্যাপের মাস্টার তালিকা। এমন হতে পারে যে অ্যাপের একটি প্রোডাক্টের স্কোপ A ও B এবং দ্বিতীয় প্রোডাক্টের স্কোপ C
ও D অথবা যেকোনও কম্বিনেশন। ক্লায়েন্ট কোনও scope প্যারামিটার উল্লেখ না করলে (অথবা
কোনও ভ্যালু ছাড়া স্কোপ প্যারামিটার উল্লেখ করলে) টোকেনটি চারটি স্কোপের সবকটি পাবে: A, B, C,
এবং D. আবার, টোকেন স্কোপের একটি সেট পায় যা ডেভেলপার অ্যাপের দ্বারা স্বীকৃত
সব স্কোপের ইউনিয়ন।
আরেকটি ক্ষেত্রে, ডিফল্ট আচরণ হল সমস্ত
চেনা স্কোপ সহ একটি অ্যাক্সেস টোকেন ফেরত দেওয়া এবং এটি তখনই হয় যখন GenerateAccessToken নীতি (Apigee Edge নীতি যা
অ্যাক্সেস টোকেন তৈরি করে) কোনও <Scope> এলিমেন্ট নির্দিষ্ট করে না দেয়।
যেমন, এখানে একটি GenerateAccessToken নীতি দেওয়া হল যেখানে <Scope>
is নির্দিষ্ট করা আছে। সেই <Scope> এলিমেন্টটি না থাকলে (অথবা সেটি উপস্থিত থাকলেও
খালি থাকলে), ডিফল্ট আচরণ এক্সিকিউট করা হয়।
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-GenerateAccessToken"> <DisplayName>OAuthV2 - Generate Access Token</DisplayName> <Attributes> <Attribute name='hello' ref='system.time' display='false'>value1</Attribute> </Attributes> <Scope>request.queryparam.scope</Scope> <GrantType>request.formparam.grant_type</GrantType> <ExternalAuthorization>false</ExternalAuthorization> <Operation>GenerateAccessToken</Operation> <SupportedGrantTypes> <GrantType>client_credentials</GrantType> </SupportedGrantTypes> <GenerateResponse enabled="true"/> </OAuthV2>
স্কোপ কীভাবে এনফোর্স করা হয়?
প্রথমত, মনে রাখবেন যে Apigee Edge-এ, OAuthV2 নীতির মাধ্যমে অ্যাক্সেস টোকেন যাচাই করা হয় (সাধারণত প্রক্সি ফ্লোর একেবারে শুরুতে রাখা হয়)। নীতিতে অবশ্যই VerifyAccessToken অপারেশন নির্দিষ্ট করা থাকতে হবে। এই নীতিটি দেখে নেওয়া যাক:
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
<DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
<ExternalAuthorization>false</ExternalAuthorization>
<Operation>VerifyAccessToken</Operation>
<Scope>A</Scope> <!-- Optional: space-separated list of scope names. -->
<GenerateResponse enabled="true"/>
</OAuthV2><Scope> এলিমেন্টটি লক্ষ্য করুন। নীতি কোন কোন স্কোপ গ্রহণ করবে তা নির্দিষ্ট করতে এটি ব্যবহার করা হয়।
এই উদাহরণে, অ্যাক্সেস টোকেনে "A" স্কোপ থাকলে তবেই নীতিটি সফল হবে। এই <Scope> এলিমেন্ট বাদ দেওয়া হলে অথবা এতে কোনও ভ্যালু না থাকলে, নীতিটি অ্যাক্সেস টোকেনের স্কোপ উপেক্ষা করে।
এখন, স্কোপের উপর ভিত্তি করে অ্যাক্সেস টোকেন যাচাই করার ক্ষমতা সহ, আপনি নির্দিষ্ট স্কোপ প্রয়োগ করার জন্য API ডিজাইন করতে পারবেন। আপনি এটি স্কোপ-অ্যাওয়ার VerifyAccessToken নীতি সহ কাস্টম ফ্লো ডিজাইন করার মাধ্যমে করেন।
ধরা যাক, আপনার API-তে /resourceA এন্ডপয়েন্টের জন্য একটি ফ্লো নির্দিষ্ট করা আছে:
<Flow name="resourceA">
<Condition>(proxy.pathsuffix MatchesPath "/resourceA") and (request.verb = "GET")</Condition>
<Description>Get a resource A</Description>
<Request>
<Step>
<Name>OAuthV2-VerifyAccessTokenA</Name>
</Step>
</Request>
<Response>
<Step>
<Name>AssignMessage-CreateResponse</Name>
</Step>
</Response>
</Flow>এই ফ্লো ট্রিগার করা হলে (পাথ
সাফিক্সে /resourceA সহ একটি অনুরোধ এলে), OAuthV2-VerifyAccessTokenA নীতি অবিলম্বে কল করা হয়। এই নীতি যাচাই করে যে
অ্যাক্সেস টোকেনটি বৈধ কিনা এবং টোকেনটি কোন কোন স্কোপে কাজ করে তা দেখে। নীতিটি যদি
নিচের উদাহরণের মতো <Scope>A</Scope> হিসেবে কনফিগার করা থাকে, তাহলে অ্যাক্সেস টোকেনে "A" স্কোপ থাকলে তবেই নীতিটি
সফল হবে। অন্যথায়, এটি একটি সমস্যা রিটার্ন করবে।
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
<DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
<ExternalAuthorization>false</ExternalAuthorization>
<Operation>VerifyAccessToken</Operation>
<Scope>A</Scope>
<GenerateResponse enabled="true"/>
</OAuthV2>সংক্ষেপে, API ডেভেলপাররা তাদের API-তে স্কোপ এনফোর্সমেন্ট ডিজাইন করার জন্য দায়ী। নির্দিষ্ট স্কোপ ম্যানেজ করার জন্য কাস্টম ফ্লো তৈরি করে এবং সেইসব স্কোপ এনফোর্স করার জন্য VerifyAccessToken নীতি অ্যাটাচ করে তারা এটি করে।
কোডের উদাহরণ
সবশেষে, টোকেন কীভাবে স্কোপ পায় এবং কীভাবে স্কোপ প্রয়োগ করা হয় তা বোঝাতে, আসুন কিছু API কলের উদাহরণ দেখে নেওয়া যাক।
ডিফল্ট কেস
ধরা যাক, আপনার কাছে প্রোডাক্ট সহ একটি ডেভেলপার অ্যাপ আছে এবং সেইসব প্রোডাক্টের স্কোপের ইউনিয়ন হল: A, B ও C. এই API কল একটি অ্যাক্সেস টোকেনের জন্য অনুরোধ করে, কিন্তু কোনও স্কোপ কোয়েরি প্যারামিটার নির্দিষ্ট করে না।
curl -X POST -H content-type:application/x-www-form-urlencoded http://wwitman-test.apigee.net/scopecheck1/token?grant_type=client_credentials
এই ক্ষেত্রে, জেনারেট করা টোকেনকে A, B ও C স্কোপ দেওয়া হবে (এটি ডিফল্ট আচরণ)। টোকেনের মেটাডেটা দেখতে এই ধরনের হবে:
{ "issued_at" : "1417016208588", "application_name" : "eb1a0333-5775-4116-9eb2-c36075ddc360", "scope" : "A B C", "status" : "approved", "api_product_list" : "[scopecheck1-yEgQbQqjRR]", "expires_in" : "1799", //--in seconds "developer.email" : "scopecheck1-yxiuHuZcDW@apigee.com", "organization_id" : "0", "token_type" : "BearerToken", "client_id" : "atGFvl3jgA0pJd05rXKHeNAC69naDmpW", "access_token" : "MveXpj4UYXol38thNoJYIa8fBGlI", "organization_name" : "wwitman", "refresh_token_expires_in" : "0", //--in seconds "refresh_count" : "0" }
এখন, ধরে নিন আপনার কাছে এমন একটি API এন্ডপয়েন্ট আছে যার স্কোপ "A" (অর্থাৎ, VerifyAccessToken -এর জন্য স্কোপ "A" প্রয়োজন)। VerifyAccessToken নীতি এখানে দেওয়া হল:
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenA">
<DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
<ExternalAuthorization>false</ExternalAuthorization>
<Operation>VerifyAccessToken</Operation>
<Scope>A</Scope>
<GenerateResponse enabled="true"/>
</OAuthV2>এখানে একটি এন্ডপয়েন্টে কল করার নমুনা দেওয়া হল যা স্কোপ A প্রয়োগ করে:
curl -X GET -H Authorization: Bearer MveXpj4UYXol38thNoJYIa8fBGlI http://wwitman-test.apigee.net/scopecheck1/resourceA
এই GET কল সফল হয়েছে:
{
"hello" : "Tue, 25 Nov 2014 01:35:53 UTC"
}এটি সফল হয় কারণ এন্ডপয়েন্ট কল করা হলে ট্রিগার করা VerifyAccessToken নীতিতে স্কোপ 'ক' প্রয়োজন হয় এবং অ্যাক্সেস টোকেনকে স্কোপ 'ক', 'খ' ও 'গ' দেওয়া হয়েছে -- এটি হল ডিফল্ট ব্যবহার।
ফিল্টার করার কেস
ধরা যাক, আপনার কাছে এমন একটি ডেভেলপার অ্যাপ আছে যার প্রোডাক্টের স্কোপ হল A, B, C ও X. আপনি
অ্যাক্সেস টোকেনের অনুরোধ করেন এবং scope কোয়েরি প্যারামিটার যোগ করেন, যেমন:
curl -i -X POST -H content-type:application/x-www-form-urlencoded 'http://myorg-test.apigee.net/oauth/token?grant_type=client_credentials&scope=A X'
এই ক্ষেত্রে, তৈরি হওয়া টোকেনকে স্কোপ A ও X দেওয়া হবে, কারণ A ও X দুটিই সঠিক স্কোপ। মনে রাখবেন, ডেভেলপার অ্যাপ স্কোপ A, B, C ও X শনাক্ত করে। এই ক্ষেত্রে, আপনি এইসব স্কোপের উপর ভিত্তি করে API প্রোডাক্টের তালিকা ফিল্টার করছেন। কোনও প্রোডাক্টের স্কোপ A বা X থাকলে, আপনি API এন্ডপয়েন্ট কনফিগার করতে পারবেন যা এইসব স্কোপ প্রয়োগ করবে। কোনও প্রোডাক্টে A বা X স্কোপ না থাকলে (ধরা যাক,এতে B, C ও Z স্কোপ আছে), তাহলে A বা X স্কোপ প্রয়োগ করে এমন API টোকেন দিয়ে কল করা যাবে না।
নতুন টোকেন দিয়ে API কল করলে:
curl -X GET -H Authorization: Bearer Rkmqo2UkEIyIBCrtro1QpIG http://wwitman-test.apigee.net/scopecheck1/resourceX
API প্রক্সি অ্যাক্সেস টোকেন যাচাই করে। যেমন:
<OAuthV2 async="false" continueOnError="false" enabled="true" name="OAuthV2-VerifyAccessTokenX">
<DisplayName>Verify OAuth v2.0 Access Token</DisplayName>
<ExternalAuthorization>false</ExternalAuthorization>
<Operation>VerifyAccessToken</Operation>
<Scope>A X</Scope>
<GenerateResponse enabled="true"/>
</OAuthV2>GET কল ট্রিগার সফল হয় এবং এটি একটি উত্তর রিটার্ন করে। যেমন:
{
"hello" : "Tue, 25 Nov 2014 01:35:53 UTC"
}
এটি সফল হয়েছে কারণ VerifyAccessToken নীতিতে স্কোপ A বা X প্রয়োজন এবং অ্যাক্সেস টোকেন
স্কোপ A ও X অন্তর্ভুক্ত করে। অবশ্যই, <Scope> এলিমেন্ট "B" হিসেবে সেট করা থাকলে,
এই কলটি ব্যর্থ হবে।
সারাংশ
Apigee Edge কীভাবে OAuth 2.0 স্কোপ ম্যানেজ করে তা বোঝা গুরুত্বপূর্ণ। এখানে গুরুত্বপূর্ণ টেক-অ্যাওয়ে পয়েন্ট দেওয়া হল:
- কোনও ডেভেলপার অ্যাপ তার সব প্রোডাক্টের জন্য সংজ্ঞায়িত সব স্কোপের ইউনিয়নকে "চেনে"।
- কোনও অ্যাপ অ্যাক্সেস টোকেনের জন্য অনুরোধ করলে, সেটি কোন স্কোপ পেতে চায় তা নির্দিষ্ট করার সুযোগ পায়। কোন স্কোপ Apigee Edge (অনুমোদন সার্ভার) আসলে অ্যাক্সেস টোকেনে অ্যাসাইন করবে তা (ক) অনুরোধ করা স্কোপ এবং (খ) ডেভেলপার অ্যাপের দ্বারা শনাক্ত করা স্কোপের উপর ভিত্তি করে ঠিক করা হয়।
- স্কোপ চেক করার জন্য Apigee Edge কনফিগার করা না থাকলে (VerifyAccessToken নীতিতে
<Scope>এলিমেন্ট নেই অথবা এটি খালি), তাহলে API কল সফল হবে, কারণ অ্যাক্সেস টোকেনে এম্বেড করা স্কোপটি রেজিস্টার করা ডেভেলপার অ্যাপের দ্বারা স্বীকৃত স্কোপের (অ্যাপের "মাস্টার" স্কোপের তালিকায় থাকা স্কোপের মধ্যে একটি) সাথে ম্যাচ করে। - অ্যাক্সেস টোকেনের সাথে কোনও স্কোপ যুক্ত না থাকলে, এটি শুধুমাত্র সেইসব ক্ষেত্রে কাজ করবে
যেখানে Edge স্কোপ বিবেচনা করে না (VerifyAccessToken নীতিতে
<Scope>এলিমেন্ট নেই অথবা এটি খালি)।