OAuth2 স্কোপের সাথে কাজ করা

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশনে যান
তথ্য

Apigee Edge-এ OAuth 2.0 স্কোপগুলি কীভাবে ব্যবহার করবেন এই বিষয়টি আলোচনা করে।

OAuth2 সুযোগ কি?

OAuth 2.0 স্কোপগুলি অ্যাক্সেস টোকেনকে দেওয়া অ্যাক্সেসের পরিমাণ সীমিত করার একটি উপায় প্রদান করে। উদাহরণস্বরূপ, একটি ক্লায়েন্ট অ্যাপে ইস্যু করা একটি অ্যাক্সেস টোকেন সুরক্ষিত সংস্থানগুলিতে READ এবং WRITE অ্যাক্সেস বা শুধু READ অ্যাক্সেস মঞ্জুর করা যেতে পারে। আপনি যেকোন সুযোগ বা আপনার ইচ্ছামতো স্কোপের সমন্বয় প্রয়োগ করতে আপনার APIs প্রয়োগ করতে পারেন। সুতরাং, যদি একটি ক্লায়েন্ট একটি টোকেন পায় যার READ সুযোগ রয়েছে এবং এটি একটি API এন্ডপয়েন্টে কল করার চেষ্টা করে যার জন্য WRITE অ্যাক্সেস প্রয়োজন, কলটি ব্যর্থ হবে৷

এই বিষয়ে, আমরা আলোচনা করব কীভাবে টোকেন অ্যাক্সেসের জন্য স্কোপ বরাদ্দ করা হয় এবং কীভাবে Apigee Edge OAuth 2.0 স্কোপগুলিকে প্রয়োগ করে। এই বিষয়টি পড়ার পরে, আপনি আত্মবিশ্বাসের সাথে সুযোগগুলি ব্যবহার করতে সক্ষম হবেন৷

টোকেন অ্যাক্সেস করার জন্য কীভাবে স্কোপ বরাদ্দ করা হয়?

যখন এজ একটি অ্যাক্সেস টোকেন তৈরি করে, তখন এটি সেই টোকেনের জন্য একটি সুযোগ বরাদ্দ করতে পারে। এটি কীভাবে হয় তা বোঝার জন্য, আপনাকে প্রথমে এই Apigee Edge সত্ত্বাগুলির সাথে পরিচিত হতে হবে: API পণ্য, বিকাশকারী এবং বিকাশকারী অ্যাপ৷ একটি ভূমিকার জন্য, প্রকাশনার ভূমিকা দেখুন। আমরা সুপারিশ করছি যে আপনি যদি চালিয়ে যাওয়ার আগে প্রয়োজন হয় তবে আপনি এই উপাদানটি পর্যালোচনা করুন।

একটি অ্যাক্সেস টোকেন হল এলোমেলো চেহারার অক্ষরের একটি দীর্ঘ স্ট্রিং যা এজকে ইনকামিং 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"
}

টোকেনের মেটাডেটাতে প্রকৃত অ্যাক্সেস টোকেন স্ট্রিং, মেয়াদোত্তীর্ণ তথ্য, ডেভেলপার অ্যাপের শনাক্তকরণ, ডেভেলপার এবং টোকেনের সাথে যুক্ত পণ্য অন্তর্ভুক্ত থাকে। আপনি আরও লক্ষ্য করবেন যে মেটাডেটাতে "স্কোপ" অন্তর্ভুক্ত রয়েছে।

কিভাবে টোকেন তার সুযোগ পায়?

সুযোগ বোঝার প্রথম চাবিকাঠি হল মনে রাখা যে একটি বিকাশকারী অ্যাপের প্রতিটি পণ্যের জন্য শূন্য বা তার বেশি স্কোপ বরাদ্দ করা থাকতে পারে। পণ্য তৈরি করার সময় এই স্কোপগুলি বরাদ্দ করা যেতে পারে, অথবা সেগুলি পরে যোগ করা যেতে পারে। এগুলি নামের তালিকা হিসাবে বিদ্যমান এবং প্রতিটি পণ্যের সাথে যুক্ত "মেটাডেটা" এর অন্তর্ভুক্ত।

আপনি যখন একটি ডেভেলপার অ্যাপ তৈরি করেন এবং এতে পণ্য যোগ করেন, তখন এজ ডেভেলপার অ্যাপের সমস্ত পণ্যের দিকে নজর দেয় এবং সেই পণ্যগুলির জন্য সমস্ত সুযোগের একটি তালিকা তৈরি করে (অ্যাপের মাস্টার বা গ্লোবাল স্কোপের তালিকা -- সমস্ত স্বীকৃতদের একটি ইউনিয়ন সুযোগ)।

যখন একটি ক্লায়েন্ট অ্যাপ Apigee Edge থেকে একটি অ্যাক্সেস টোকেন অনুরোধ করে, তখন এটি ঐ টোকেনের সাথে কোন স্কোপ যুক্ত করতে চায় তা ঐচ্ছিকভাবে নির্দিষ্ট করতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত অনুরোধটি "A" স্কোপের জন্য জিজ্ঞাসা করে। অর্থাৎ, ক্লায়েন্ট জিজ্ঞাসা করছে যে অনুমোদন সার্ভার (এজ) একটি অ্যাক্সেস টোকেন তৈরি করে যার স্কোপ "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

কি হয়?

যখন এজ এই অনুরোধটি পায় তখন এটি জানে কোন অ্যাপটি অনুরোধ করছে এবং এটি জানে যে কোন বিকাশকারী অ্যাপটি ক্লায়েন্ট নিবন্ধিত হয়েছে (ক্লায়েন্ট আইডি এবং ক্লায়েন্ট গোপন কীগুলি মৌলিক প্রমাণীকরণ শিরোনামে এনকোড করা আছে)। কারণ scope কোয়েরি প্যারামিটার অন্তর্ভুক্ত করা হয়েছে, এজকে সিদ্ধান্ত নিতে হবে যে ডেভেলপার অ্যাপের সাথে যুক্ত কোনো API পণ্যের স্কোপ "A" আছে কিনা। যদি তারা করে, তাহলে সুযোগ "A" সহ একটি অ্যাক্সেস টোকেন তৈরি করা হয়। এটি দেখার আরেকটি উপায় হল স্কোপ কোয়েরি প্যারামিটার হল এক ধরনের ফিল্টার। যদি বিকাশকারী অ্যাপটি "A, B, X" স্কোপগুলিকে স্বীকৃতি দেয় এবং কোয়েরি প্যারামিটারটি "স্কোপ=XYZ" নির্দিষ্ট করে, তাহলে টোকেনে শুধুমাত্র "X" স্কোপ বরাদ্দ করা হবে।

যদি ক্লায়েন্ট একটি সুযোগ পরামিতি সংযুক্ত না করে? এই ক্ষেত্রে, এজ একটি টোকেন তৈরি করে যাতে বিকাশকারী অ্যাপ দ্বারা স্বীকৃত সমস্ত সুযোগ অন্তর্ভুক্ত থাকে। এটা বোঝা গুরুত্বপূর্ণ যে ডিফল্ট আচরণ হল একটি অ্যাক্সেস টোকেন ফেরত দেওয়া যাতে ডেভেলপার অ্যাপে অন্তর্ভুক্ত সমস্ত পণ্যের জন্য সমস্ত সুযোগের মিল থাকে৷

যদি কোনও বিকাশকারী অ্যাপের সাথে যুক্ত পণ্যগুলির কোনওটিই স্কোপ নির্দিষ্ট করে না, এবং একটি টোকেনের একটি সুযোগ থাকে, তাহলে সেই টোকেন দিয়ে করা কলগুলি ব্যর্থ হবে৷

ধরা যাক একটি ডেভেলপার অ্যাপ এই স্কোপগুলিকে স্বীকৃতি দেয়: ABC D. এটি হল অ্যাপের স্কোপের মাস্টার তালিকা৷ এটি হতে পারে যে অ্যাপের একটি পণ্যের স্কোপ A এবং B রয়েছে এবং দ্বিতীয়টিতে স্কোপ C এবং D, বা যেকোনো সংমিশ্রণ রয়েছে। যদি ক্লায়েন্ট একটি scope প্যারামিটার নির্দিষ্ট না করে (অথবা যদি এটি কোনও মান ছাড়াই স্কোপ প্যারামিটার নির্দিষ্ট করে) টোকেনটি চারটি স্কোপ মঞ্জুর করা হবে: A, B, C, এবং D। আবার, টোকেনটি স্কোপের একটি সেট গ্রহণ করে যা হল বিকাশকারী অ্যাপ দ্বারা স্বীকৃত সমস্ত সুযোগের মিলন।

আরও একটি কেস রয়েছে যেখানে ডিফল্ট আচরণ হল সমস্ত স্বীকৃত স্কোপের সাথে একটি অ্যাক্সেস টোকেন ফেরত দেওয়া, এবং সেটি হল যখন GenerateAccessToken নীতি (Apigee Edge নীতি যা অ্যাক্সেস টোকেন তৈরি করে) একটি <Scope> উপাদান নির্দিষ্ট করে না । উদাহরণস্বরূপ, এখানে একটি GenerateAccessToken নীতি যেখানে <Scope> নির্দিষ্ট করা আছে । যদি সেই <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" অন্তর্ভুক্ত থাকে। যদি এই <স্কোপ> উপাদানটি বাদ দেওয়া হয় বা এটির কোনো মান না থাকে, তাহলে নীতি অ্যাক্সেস টোকেনের সুযোগ উপেক্ষা করে।

এখন, সুযোগের উপর ভিত্তি করে অ্যাক্সেস টোকেনগুলি যাচাই করার ক্ষমতা সহ, আপনি নির্দিষ্ট স্কোপগুলি প্রয়োগ করতে আপনার 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 প্রয়োজন, এবং অ্যাক্সেস টোকেনটি স্কোপ A, B এবং C - ডিফল্ট আচরণ মঞ্জুর করা হয়েছিল।

ফিল্টারিং কেস

ধরা যাক আপনার কাছে 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 আছে), তাহলে APIs যেগুলি স্কোপ A বা X প্রয়োগ করে টোকেন দিয়ে কল করা যাবে না।

আপনি যখন নতুন টোকেন সহ 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 (অনুমোদন সার্ভার) এর উপর নির্ভর করে যে এটি আসলে কোন স্কোপগুলিকে অ্যাক্সেস টোকেনের জন্য বরাদ্দ করবে (a) অনুরোধ করা সুযোগ(গুলি) এবং (b) বিকাশকারী অ্যাপ দ্বারা স্বীকৃত।
  • Apigee Edge স্কোপ চেক করার জন্য কনফিগার করা না থাকলে (VerifyAccessToken নীতি থেকে <Scope> উপাদানটি অনুপস্থিত বা এটি খালি), তাহলে API কল সফল হবে যতক্ষণ না অ্যাক্সেস টোকেনে এমবেড করা স্কোপ স্বীকৃত স্কোপের একটির সাথে মেলে। নিবন্ধিত বিকাশকারী অ্যাপ দ্বারা (অ্যাপের "মাস্টার" স্কোপের তালিকার একটি স্কোপ)।
  • যদি একটি অ্যাক্সেস টোকেনের সাথে সম্পর্কিত কোনো সুযোগ না থাকে, তাহলে এটি শুধুমাত্র সেই ক্ষেত্রেই সফল হবে যেখানে এজ সুযোগ বিবেচনা করে না (VerifyAccessToken নীতি থেকে <Scope> উপাদানটি অনুপস্থিত বা এটি খালি)।