ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশনের জন্য OAuth 2.0 ব্যবহার করা

এই ডকুমেন্ট থেকে জানতে পারবেন যে জাভাস্ক্রিপ্ট ওয়েব অ্যাপ্লিকেশন থেকে YouTube Data API অ্যাক্সেস করার জন্য OAuth 2.0 অনুমোদন কীভাবে প্রয়োগ করতে হয়। OAuth 2.0 ব্যবহারকারীদের তাদের ইউজারনেম, পাসওয়ার্ড ও অন্যান্য তথ্য গোপন রেখে কোনও অ্যাপ্লিকেশনের সাথে নির্দিষ্ট ডেটা শেয়ার করতে দেয়। যেমন, কোনও চ্যানেলের YouTube ডেটা রিট্রিভ করার অনুমতি পেতে, কোনও অ্যাপ্লিকেশন OAuth 2.0 ব্যবহার করতে পারে।

এই OAuth 2.0 ফ্লোকে ইমপ্লিসিট গ্র্যান্ট ফ্লো বলা হয়। এটি এমন অ্যাপ্লিকেশনের জন্য ডিজাইন করা হয়েছে যেগুলি ব্যবহারকারী অ্যাপ্লিকেশন ব্যবহার করার সময় শুধুমাত্র API অ্যাক্সেস করে। এইসব অ্যাপ্লিকেশন গোপন তথ্য সেভ করতে পারে না।

এই ফ্লোতে, আপনার অ্যাপ একটি Google URL খোলে যা আপনার অ্যাপ এবং অ্যাপের প্রয়োজনীয় API অ্যাক্সেসের ধরন শনাক্ত করতে কোয়েরি প্যারামিটার ব্যবহার করে। আপনি বর্তমান ব্রাউজার উইন্ডো বা ডায়ালগে URL খুলতে পারবেন। ব্যবহারকারী Google-এর মাধ্যমে যাচাই করতে এবং অনুরোধ করা অনুমতি দিতে পারবেন। তারপরে Google ব্যবহারকারীকে আপনার অ্যাপে রিডাইরেক্ট করে। রিডাইরেক্টে একটি অ্যাক্সেস টোকেন থাকে, যা আপনার অ্যাপ যাচাই করে এবং তারপরে API অনুরোধ করার জন্য ব্যবহার করে।

Google APIs ক্লায়েন্ট লাইব্রেরি এবং Google Identity Services

Google-এ অনুমোদিত কল করার জন্য আপনি JavaScript-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, অনুমোদনের ফ্লো ম্যানেজ করার জন্য আপনাকে Google Identity Services JavaScript লাইব্রেরি ব্যবহার করতে হবে। আমরা Google Identity Services-এর কোড মডেল ব্যবহার করার জন্য সাজেস্ট করি, যা PKCE সহ আরও সুরক্ষিত অথরাইজেশন কোডের ফ্লোয়ের উপর ভিত্তি করে তৈরি।

পূর্বশর্ত

আপনার প্রোজেক্টের জন্য API চালু করা

Google API কল করে এমন যেকোনও অ্যাপ্লিকেশনকে API কনসোলে সেইসব API চালু করতে হবে।

আপনার প্রোজেক্টের জন্য API চালু করতে:

  1. Google API Console-এ API লাইব্রেরি খুলুন।
  2. প্রম্পট করা হলে, কোনও প্রোজেক্ট বেছে নিন অথবা নতুন একটি তৈরি করুন।
  3. YouTube Data API খুঁজে পেতে এবং চালু করতে লাইব্রেরি পৃষ্ঠা ব্যবহার করুন। আপনার অ্যাপ্লিকেশন ব্যবহার করবে এমন অন্য কোনও API খুঁজুন এবং সেগুলিও চালু করুন।

অনুমোদনের ক্রেডেনশিয়াল তৈরি করুন

Google API অ্যাক্সেস করার জন্য OAuth 2.0 ব্যবহার করে এমন যেকোনও অ্যাপ্লিকেশনের অবশ্যই অনুমোদন সংক্রান্ত ক্রেডেনশিয়াল থাকতে হবে যা Google-এর OAuth 2.0 সার্ভারে অ্যাপ্লিকেশনটি শনাক্ত করে। আপনার প্রোজেক্টের জন্য কীভাবে ক্রেডেনশিয়াল তৈরি করবেন তা নিচের ধাপগুলি থেকে জানতে পারবেন। আপনার অ্যাপ্লিকেশন তখন ক্রেডেনশিয়াল ব্যবহার করে সেইসব API অ্যাক্সেস করতে পারবে যেগুলি আপনি সেই প্রোজেক্টের জন্য চালু করেছেন।

  1. ক্লায়েন্ট পৃষ্ঠায় যান।
  2. ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
  3. ওয়েব অ্যাপ্লিকেশন অ্যাপ্লিকেশনের ধরন বেছে নিন।
  4. ফর্ম পূরণ করা সম্পূর্ণ করুন। যেসব অ্যাপ্লিকেশন অনুমোদিত Google API অনুরোধ করতে জাভাস্ক্রিপ্ট ব্যবহার করে সেগুলিকে অবশ্যই অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন উল্লেখ করতে হবে। অরিজিন সেইসব ডোমেনকে শনাক্ত করে যেখান থেকে আপনার অ্যাপ্লিকেশন OAuth 2.0 সার্ভারে অনুরোধ পাঠাতে পারে। এইসব অরিজিনকে অবশ্যই Google-এর যাচাইকরণ সংক্রান্ত নিয়ম মেনে চলতে হবে।

অ্যাক্সেস স্কোপ শনাক্ত করা

স্কোপ আপনার অ্যাপ্লিকেশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্স অ্যাক্সেস করার অনুরোধ করতে দেয় এবং ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেসের পরিমাণ নিয়ন্ত্রণ করতে দেয়। তাই, অনুরোধ করা স্কোপের সংখ্যা এবং ব্যবহারকারীর সম্মতি পাওয়ার সম্ভাবনার মধ্যে বিপরীত সম্পর্ক থাকতে পারে।

OAuth 2.0 অনুমোদন প্রয়োগ করা শুরু করার আগে, আমরা সাজেস্ট করি যে আপনি সেইসব স্কোপ শনাক্ত করুন যেগুলি অ্যাক্সেস করার জন্য আপনার অ্যাপের অনুমতি প্রয়োজন হবে।

YouTube Data API v3 নিম্নলিখিত স্কোপ ব্যবহার করে:

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ youtube আপনার YouTube অ্যাকাউন্ট পরিচালনা করুন
https://www. googleapis. com/ auth/ youtube. channel-memberships. creator আপনার বর্তমান সক্রিয় চ্যানেল সদস্যদের তালিকা, তাদের বর্তমান স্তর এবং তারা কখন সদস্য হয়েছেন তা দেখুন
https://www. googleapis. com/ auth/ youtube. force-ssl আপনার YouTube ভিডিও, রেটিং, মন্তব্য এবং ক্যাপশনগুলি দেখুন, সম্পাদনা করুন এবং স্থায়ীভাবে মুছুন৷
https://www. googleapis. com/ auth/ youtube. readonly আপনার YouTube অ্যাকাউন্ট দেখুন
https://www. googleapis. com/ auth/ youtube. upload আপনার YouTube ভিডিও পরিচালনা করুন
https://www. googleapis. com/ auth/ youtubepartner YouTube-এ আপনার সম্পদ এবং সংশ্লিষ্ট বিষয়বস্তু দেখুন ও পরিচালনা করুন
https://www. googleapis. com/ auth/ youtubepartner-channel-audit একটি YouTube অংশীদারের সাথে অডিট প্রক্রিয়া চলাকালীন প্রাসঙ্গিক আপনার YouTube চ্যানেলের ব্যক্তিগত তথ্য দেখুন৷

OAuth 2.0 API স্কোপ ডকুমেন্টে স্কোপের সম্পূর্ণ তালিকা রয়েছে যা আপনি Google API অ্যাক্সেস করতে ব্যবহার করতে পারেন।

OAuth 2.0 অ্যাক্সেস টোকেন পাওয়া

ব্যবহারকারীর হয়ে API অনুরোধ করার জন্য ব্যবহারকারীর সম্মতি পেতে আপনার অ্যাপ্লিকেশন কীভাবে Google-এর OAuth 2.0 সার্ভারের সাথে ইন্টার‍্যাক্ট করে তা নিম্নলিখিত ধাপগুলি থেকে জানতে পারবেন। ব্যবহারকারীর অনুমোদন প্রয়োজন এমন Google API অনুরোধ কার্যকর করার আগে আপনার অ্যাপ্লিকেশনের কাছে অবশ্যই সেই সম্মতি থাকতে হবে।

ধাপ ১: Google-এর OAuth 2.0 সার্ভারে রিডাইরেক্ট করা

কোনও ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি চেয়ে অনুরোধ করতে, ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে রিডাইরেক্ট করুন।

OAuth 2.0 এন্ডপয়েন্ট

Google-এর OAuth 2.0 এন্ডপয়েন্ট থেকে অ্যাক্সেসের অনুরোধ করার জন্য একটি URL জেনারেট করুন https://accounts.google.com/o/oauth2/v2/auth-এ। এই এন্ডপয়েন্ট HTTPS-এর মাধ্যমে অ্যাক্সেস করা যায়; প্লেন HTTP কানেকশন প্রত্যাখ্যান করা হয়।

Google-এর অনুমোদন সার্ভার ওয়েব সার্ভার অ্যাপ্লিকেশনের জন্য নিম্নলিখিত কোয়েরি স্ট্রিং প্যারামিটার সমর্থন করে:

প্যারামিটারগুলি
client_id আবশ্যক

আপনার অ্যাপ্লিকেশনের ক্লায়েন্ট আইডি। আপনি এই ভ্যালু Cloud Console ক্লায়েন্ট পৃষ্ঠা থেকে দেখতে পাবেন।

redirect_uri আবশ্যক

ব্যবহারকারী অনুমোদন ফ্লো সম্পূর্ণ করার পরে API সার্ভার ব্যবহারকারীকে কোথায় রিডাইরেক্ট করবে তা নির্ধারণ করে। এই ভ্যালু অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট URI-এর মধ্যে কোনও একটির সাথে হুবহু মিলতে হবে, যা আপনি ক্লায়েন্টের Cloud Console-এ ক্লায়েন্ট পৃষ্ঠায় কনফিগার করেছেন। এই ভ্যালু, প্রদান করা client_id-এর জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে ম্যাচ না করলে, আপনি একটি redirect_uri_mismatch সমস্যা পাবেন।

মনে রাখবেন যে http বা https স্কিম, কেস এবং ট্রেলিং স্ল্যাশ ('/') সবকটি অবশ্যই মিলতে হবে।

response_type আবশ্যক

JavaScript অ্যাপ্লিকেশনকে প্যারামিটারের মান token হিসেবে সেট করতে হবে। এই মানটি Google যাচাইকরণ সার্ভারকে নির্দেশ দেয় যে যাচাইকরণ প্রসেস সম্পূর্ণ করার পরে ব্যবহারকারীকে যে URI-তে (#) রিডাইরেক্ট করা হবে, সেটির ফ্র্যাগমেন্ট আইডেন্টিফায়ারে অ্যাক্সেস টোকেনটি name=value পেয়ার হিসেবে ফেরত দিতে হবে।

scope আবশ্যক

একটি স্পেস-ডিলিমিটেড স্কোপের তালিকা যা সেইসব রিসোর্সকে শনাক্ত করে যেগুলি আপনার অ্যাপ্লিকেশন ব্যবহারকারীর হয়ে অ্যাক্সেস করতে পারে। এইসব ভ্যালু সম্মতি সংক্রান্ত স্ক্রিনকে জানায় যে Google ব্যবহারকারীকে কী দেখায়।

স্কোপ আপনার অ্যাপ্লিকেশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্স অ্যাক্সেস করার অনুরোধ করতে দেয় এবং ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনকে দেওয়া অ্যাক্সেসের পরিমাণ নিয়ন্ত্রণ করতে দেয়। তাই, অনুরোধ করা স্কোপের সংখ্যা এবং ব্যবহারকারীর সম্মতি পাওয়ার সম্ভাবনার মধ্যে বিপরীত সম্পর্ক রয়েছে।

YouTube Data API v3 নিম্নলিখিত স্কোপ ব্যবহার করে:

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ youtube আপনার YouTube অ্যাকাউন্ট পরিচালনা করুন
https://www. googleapis. com/ auth/ youtube. channel-memberships. creator আপনার বর্তমান সক্রিয় চ্যানেল সদস্যদের তালিকা, তাদের বর্তমান স্তর এবং তারা কখন সদস্য হয়েছেন তা দেখুন
https://www. googleapis. com/ auth/ youtube. force-ssl আপনার YouTube ভিডিও, রেটিং, মন্তব্য এবং ক্যাপশনগুলি দেখুন, সম্পাদনা করুন এবং স্থায়ীভাবে মুছুন৷
https://www. googleapis. com/ auth/ youtube. readonly আপনার YouTube অ্যাকাউন্ট দেখুন
https://www. googleapis. com/ auth/ youtube. upload আপনার YouTube ভিডিও পরিচালনা করুন
https://www. googleapis. com/ auth/ youtubepartner YouTube-এ আপনার সম্পদ এবং সংশ্লিষ্ট বিষয়বস্তু দেখুন ও পরিচালনা করুন
https://www. googleapis. com/ auth/ youtubepartner-channel-audit একটি YouTube অংশীদারের সাথে অডিট প্রক্রিয়া চলাকালীন প্রাসঙ্গিক আপনার YouTube চ্যানেলের ব্যক্তিগত তথ্য দেখুন৷

OAuth 2.0 API স্কোপ ডকুমেন্ট স্কোপের সম্পূর্ণ তালিকা প্রদান করে যা আপনি Google API অ্যাক্সেস করতে ব্যবহার করতে পারেন।

আমরা সাজেস্ট করি যে আপনার অ্যাপ্লিকেশন যখনই সম্ভব হবে তখনই প্রসঙ্গে অনুমোদনের স্কোপে অ্যাক্সেসের অনুরোধ করবে। ইনক্রিমেন্টাল অনুমোদনের মাধ্যমে, প্রাসঙ্গিক ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুরোধ করে, আপনি ব্যবহারকারীদের বুঝতে সাহায্য করেন যে আপনার অ্যাপ্লিকেশন কেন অ্যাক্সেসের অনুরোধ করছে।

state সাজেস্ট করা হয়

আপনার অ্যাপ্লিকেশন, আপনার অনুমতি সংক্রান্ত অনুরোধ এবং অনুমতি সার্ভারের উত্তরের মধ্যে স্টেট বজায় রাখার জন্য ব্যবহার করে এমন যেকোনও স্ট্রিং ভ্যালু নির্দিষ্ট করে। ব্যবহারকারী আপনার অ্যাপ্লিকেশনের অ্যাক্সেসের অনুরোধে সম্মতি বা অসম্মতি জানানোর পরে, সার্ভারটি ঠিক সেই ভ্যালু ফেরত দেয় যা আপনি redirect_uri-এর URL ফ্র্যাগমেন্ট আইডেন্টিফায়ারে (#) name=value পেয়ার হিসেবে পাঠান।

আপনি এই প্যারামিটারটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, যেমন আপনার অ্যাপ্লিকেশনে ব্যবহারকারীকে সঠিক রিসোর্সে ডাইরেক্ট করা, ননস পাঠানো এবং ক্রস-সাইট অনুরোধ জালিয়াতি কমানো। আপনার redirect_uri অনুমান করা যেতে পারে, তাই state ভ্যালু ব্যবহার করলে, ইনকামিং কানেকশন যে একটি যাচাইকরণ অনুরোধের ফলাফল, সেই ব্যাপারে আপনার নিশ্চয়তা বাড়তে পারে। আপনি যদি কোনও র‍্যান্ডম স্ট্রিং তৈরি করেন বা কোনও কুকির হ্যাশ এনকোড করেন অথবা অন্য কোনও ভ্যালু যা ক্লায়েন্টের স্ট্যাটাস ক্যাপচার করে, তাহলে আপনি অনুরোধ এবং উত্তর একই ব্রাউজার থেকে এসেছে কিনা তা অতিরিক্তভাবে নিশ্চিত করতে উত্তরটি যাচাই করতে পারেন, ক্রস-সাইট অনুরোধ জালিয়াতি-এর মতো আক্রমণ থেকে সুরক্ষা প্রদান করে। state টোকেন কীভাবে তৈরি ও কনফার্ম করতে হয় তার উদাহরণ দেখতে OpenID Connect ডকুমেন্টেশন দেখুন।

include_granted_scopes ঐচ্ছিক

প্রসঙ্গের মধ্যে অতিরিক্ত স্কোপ অ্যাক্সেস করার অনুরোধ করতে, ইনক্রিমেন্টাল অনুমোদন ব্যবহার করার জন্য অ্যাপ্লিকেশনকে সক্ষম করে। আপনি এই প্যারামিটারের ভ্যালু true হিসেবে সেট করলে এবং অনুমতির অনুরোধ মঞ্জুর করা হলে, নতুন অ্যাক্সেস টোকেন সেইসব স্কোপকেও কভার করবে যেগুলিতে ব্যবহারকারী আগে অ্যাপ্লিকেশন অ্যাক্সেস করার অনুমতি দিয়েছেন। উদাহরণ দেখতে ইনক্রিমেন্টাল অথরাইজেশন বিভাগ দেখুন।

login_hint ঐচ্ছিক

কোন ব্যবহারকারী যাচাই করার চেষ্টা করছেন তা আপনার অ্যাপ্লিকেশন জানলে, এটি Google যাচাইকরণ সার্ভারকে ইঙ্গিত দিতে এই প্যারামিটার ব্যবহার করতে পারে। সাইন-ইন ফর্মে ইমেল ফিল্ড আগে থেকে পূরণ করে অথবা উপযুক্ত মাল্টি-লগ-ইন সেশন বেছে নিয়ে লগ-ইন ফ্লো সহজ করার জন্য সার্ভার এই ইঙ্গিত ব্যবহার করে।

প্যারামিটারের মান ইমেল আইডি বা sub আইডেন্টিফায়ারে সেট করুন, যা ব্যবহারকারীর Google আইডির সমতুল্য।

prompt ঐচ্ছিক

ব্যবহারকারীকে দেখানোর জন্য স্পেস-ডিলিমিটেড, কেস-সংবেদনশীল প্রম্পটের তালিকা। আপনি এই প্যারামিটার উল্লেখ না করলে, আপনার প্রোজেক্ট অ্যাক্সেসের জন্য অনুরোধ করার সময় ব্যবহারকারীকে শুধুমাত্র প্রথমবার প্রম্পট করা হবে। আরও তথ্যের জন্য আবার সম্মতি দেওয়ার জন্য প্রম্পট করা দেখুন।

সম্ভাব্য ভ্যালুগুলি হল:

none কোনও যাচাইকরণ বা সম্মতি সংক্রান্ত স্ক্রিন দেখাবেন না। অন্যান্য মানের সাথে উল্লেখ করা যাবে না।
consent সম্মতির জন্য ব্যবহারকারীকে প্রম্পট করুন।
select_account ব্যবহারকারীকে অ্যাকাউন্ট বেছে নিতে প্রম্পট করুন।

Google-এর অনুমোদন সার্ভারে রিডাইরেক্ট করার নমুনা

নিচে একটি URL-এর উদাহরণ দেখানো হল, যা সহজে পড়ার জন্য লাইন ব্রেক ও স্পেস ব্যবহার করা হয়েছে। URL-টি এমন একটি স্কোপে অ্যাক্সেসের অনুরোধ করে যা ব্যবহারকারীর YouTube ডেটা অ্যাক্সেস করার অনুমতি দেয়। নতুন অ্যাক্সেস টোকেন যাতে ব্যবহারকারী আগে অ্যাপ্লিকেশন অ্যাক্সেস করার জন্য সম্মতি দিয়েছেন এমন যেকোনও স্কোপ কভার করে তা নিশ্চিত করতে এটি ইনক্রিমেন্টাল অনুমোদন (include_granted_scopes=true) ব্যবহার করে। এছাড়াও, উদাহরণে অন্যান্য প্যারামিটার সেট করা হয়েছে।

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 client_id=client_id

অনুরোধের URL তৈরি করার পরে, ব্যবহারকারীকে সেখানে রিডাইরেক্ট করুন।

JavaScript স্যাম্পেল কোড

নিচের জাভাস্ক্রিপ্ট স্নিপেট থেকে বোঝা যায় যে জাভাস্ক্রিপ্টের জন্য Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার না করে জাভাস্ক্রিপ্টে কীভাবে অনুমোদনের ফ্লো শুরু করতে হয়। যেহেতু এই OAuth 2.0 এন্ডপয়েন্ট ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) সমর্থন করে না, তাই স্নিপেটটি একটি ফর্ম তৈরি করে যা সেই এন্ডপয়েন্টে অনুরোধটি খোলে।

/*
 * Create form to request access token from Google's OAuth 2.0 server.
 */
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

  // Create <form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);

  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client_id': 'YOUR_CLIENT_ID',
                'redirect_uri': 'YOUR_REDIRECT_URI',
                'response_type': 'token',
                'scope': 'https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/calendar.readonly',
                'include_granted_scopes': 'true',
                'state': 'pass-through value'};

  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

ধাপ ২: Google ব্যবহারকারীকে সম্মতি দেওয়ার জন্য প্রম্পট করে

এই ধাপে, ব্যবহারকারী সিদ্ধান্ত নেন যে আপনার অ্যাপ্লিকেশনকে অনুরোধ করা অ্যাক্সেস দেবেন কিনা। এই পর্যায়ে, Google একটি সম্মতি উইন্ডো দেখায় যেখানে আপনার অ্যাপ্লিকেশনের নাম এবং Google API পরিষেবা দেখানো হয়, যেটির জন্য ব্যবহারকারীর অনুমোদনের ক্রেডেনশিয়াল সহ অ্যাক্সেস করার অনুমতি চাওয়া হচ্ছে এবং যে অ্যাক্সেসের স্কোপ মঞ্জুর করা হবে তার সারসংক্ষেপ দেখানো হয়। ব্যবহারকারী তখন আপনার অ্যাপ্লিকেশনের অনুরোধ করা এক বা একাধিক স্কোপে অ্যাক্সেস দেওয়ার জন্য সম্মতি দিতে পারেন বা অনুরোধ প্রত্যাখ্যান করতে পারেন।

এই পর্যায়ে আপনার অ্যাপ্লিকেশনকে কিছু করতে হবে না, কারণ এটি Google-এর OAuth 2.0 সার্ভারের উত্তর পাওয়ার জন্য অপেক্ষা করছে, যেখানে কোনও অ্যাক্সেস দেওয়া হয়েছে কিনা তা উল্লেখ করা থাকবে। সেই উত্তরটি নিম্নলিখিত ধাপে ব্যাখ্যা করা হয়েছে।

সমস্যা

Google-এর OAuth 2.0 অনুমোদন এন্ডপয়েন্টে করা অনুরোধে প্রত্যাশিত যাচাইকরণ ও অনুমোদন ফ্লোয়ের পরিবর্তে ব্যবহারকারী-কেন্দ্রিক সমস্যার মেসেজ দেখানো হতে পারে। সাধারণ সমস্যার কোড ও সাজেস্ট করা সমাধানগুলি হল:

admin_policy_enforced

Google Workspace অ্যাডমিনিস্ট্রেটরের নীতির কারণে অনুরোধ করা এক বা একাধিক স্কোপ Google অ্যাকাউন্ট অনুমোদন করতে পারছে না। আপনার OAuth ক্লায়েন্ট আইডিতে অ্যাক্সেস স্পষ্টভাবে মঞ্জুর না করা পর্যন্ত, একজন অ্যাডমিনিস্ট্রেটর কীভাবে সমস্ত স্কোপ বা সংবেদনশীল এবং সীমাবদ্ধ স্কোপগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে পারেন সে সম্পর্কে আরও তথ্যের জন্য Google Workspace অ্যাডমিন সহায়তা নিবন্ধটি দেখুন কোন থার্ড-পার্টি এবং ইন্টার্নাল অ্যাপ Google Workspace ডেটা অ্যাক্সেস করে তা নিয়ন্ত্রণ করুন।

disallowed_useragent

Google-এর OAuth 2.0 নীতি অনুযায়ী অনুমোদিত নয় এমন একটি এম্বেড করা ইউজার-এজেন্টের মধ্যে অনুমোদনের এন্ডপয়েন্ট দেখানো হয়।

iOS এবং macOS ডেভেলপাররা WKWebView-এ অনুমোদনের অনুরোধ খোলার সময় এই সমস্যার সম্মুখীন হতে পারেন। পরিবর্তে ডেভেলপারদের iOS লাইব্রেরি ব্যবহার করা উচিত, যেমন iOS-এর জন্য Google Sign-In বা OpenID Foundation-এর iOS-এর জন্য AppAuth।

iOS বা macOS অ্যাপ এম্বেড করা ইউজার-এজেন্টে সাধারণ ওয়েব লিঙ্ক খুললে এবং ব্যবহারকারী আপনার সাইট থেকে Google-এর OAuth 2.0 অথরাইজেশন এন্ডপয়েন্টে নেভিগেট করলে, ওয়েব ডেভেলপাররা এই সমস্যার সম্মুখীন হতে পারেন। ডেভেলপারদের উচিত অপারেটিং সিস্টেমের ডিফল্ট লিঙ্ক হ্যান্ডলারে সাধারণ লিঙ্ক খোলার অনুমতি দেওয়া, যার মধ্যে ইউনিভার্সাল লিঙ্ক হ্যান্ডলার বা ডিফল্ট ব্রাউজার অ্যাপ, দুটিই অন্তর্ভুক্ত। SFSafariViewController লাইব্রেরিও একটি কাজ করে এমন বিকল্প।

org_internal

অনুরোধে থাকা OAuth ক্লায়েন্ট আইডি এমন একটি প্রোজেক্টের অংশ যা নির্দিষ্ট Google Cloud সংস্থার Google অ্যাকাউন্টে অ্যাক্সেস সীমিত করে। এই কনফিগারেশন বিকল্প সম্পর্কে আরও তথ্যের জন্য, আপনার OAuth সম্মতি স্ক্রিন সেট-আপ করা সংক্রান্ত সহায়তা নিবন্ধের ব্যবহারকারীর ধরন বিভাগটি দেখুন।

invalid_client

যে উৎস থেকে অনুরোধ করা হয়েছে সেটি এই ক্লায়েন্টের জন্য অনুমোদিত নয়। origin_mismatch দেখুন।

deleted_client

অনুরোধ করার জন্য ব্যবহৃত OAuth ক্লায়েন্ট মুছে দেওয়া হয়েছে। মুছে দেওয়ার কাজটি ম্যানুয়ালি অথবা অটোমেটিক করা যেতে পারে, যদি অব্যবহৃত ক্লায়েন্ট হয়। মুছে ফেলা ক্লায়েন্টকে ৩০ দিনের মধ্যে ফিরিয়ে আনা যাবে। আরও জানুন ।

invalid_grant

ইনক্রিমেন্টাল অনুমোদন ব্যবহার করার সময়, টোকেনের মেয়াদ শেষ হয়ে যেতে পারে অথবা সেটি বাতিল হয়ে যেতে পারে। ব্যবহারকারীকে আবার যাচাই করুন এবং নতুন টোকেন পাওয়ার জন্য ব্যবহারকারীর সম্মতি চান। আপনি যদি এই সমস্যাটি দেখতে পেতে থাকেন, তাহলে আপনার অ্যাপ্লিকেশন সঠিকভাবে কনফিগার করা হয়েছে কিনা এবং আপনি আপনার অনুরোধে সঠিক টোকেন ও প্যারামিটার ব্যবহার করছেন কিনা তা নিশ্চিত করুন। অন্যথায়, ব্যবহারকারীর অ্যাকাউন্ট মুছে দেওয়া বা বন্ধ করে দেওয়া হতে পারে।

origin_mismatch

অনুমোদনের অনুরোধ করা জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট OAuth ক্লায়েন্ট আইডির জন্য রেজিস্টার করা অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে না মিলতে পারে। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠা থেকে অনুমোদিত JavaScript উৎস পর্যালোচনা করুন।

redirect_uri_mismatch

অনুমোদনের অনুরোধে পাস করা redirect_uri, OAuth ক্লায়েন্ট আইডির জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে মিলছে না। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠা থেকে অনুমোদিত রিডাইরেক্ট URI পর্যালোচনা করুন।

অনুমোদনের অনুরোধ করা জাভাস্ক্রিপ্টের স্কিম, ডোমেন এবং/অথবা পোর্ট, OAuth ক্লায়েন্ট আইডির জন্য রেজিস্টার করা অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন URI-এর সাথে নাও মিলতে পারে। Google Cloud Console-এর ক্লায়েন্ট পৃষ্ঠা থেকে অনুমোদিত JavaScript উৎস পর্যালোচনা করুন।

redirect_uri প্যারামিটার OAuth আউট-অফ-ব্যান্ড (OOB) ফ্লোকে রেফার করতে পারে যা বন্ধ করা হয়েছে এবং আর কাজ করে না। আপনার ইন্টিগ্রেশন আপডেট করতে মাইগ্রেশন গাইড দেখুন।

invalid_request

আপনার করা অনুরোধে কোনও সমস্যা হয়েছে। একাধিক কারণে এটি হতে পারে:

  • অনুরোধটি সঠিকভাবে ফর্ম্যাট করা হয়নি
  • অনুরোধে প্রয়োজনীয় প্যারামিটার নেই
  • অনুরোধটি এমন একটি যাচাইকরণ পদ্ধতি ব্যবহার করে যা Google-এ কাজ করে না। যাচাই করুন যে আপনার OAuth ইন্টিগ্রেশন একটি সাজেস্ট করা ইন্টিগ্রেশন পদ্ধতি ব্যবহার করে

ধাপ ৩: OAuth 2.0 সার্ভার রেসপন্স ম্যানেজ করা

OAuth 2.0 এন্ডপয়েন্ট

OAuth 2.0 সার্ভার আপনার অ্যাক্সেস টোকেন অনুরোধে উল্লেখ করা redirect_uri-এ একটি উত্তর পাঠায়।

ব্যবহারকারী অনুরোধ অনুমোদন করলে, উত্তরে একটি অ্যাক্সেস টোকেন থাকে। ব্যবহারকারী অনুরোধ অনুমোদন না করলে, উত্তরে একটি সমস্যার মেসেজ থাকে। অ্যাক্সেস টোকেন বা ত্রুটি মেসেজ রিডাইরেক্ট URI-এর হ্যাশ ফ্র্যাগমেন্টে ফেরত পাঠানো হয়, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

  • অ্যাক্সেস টোকেন সংক্রান্ত উত্তর:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    access_token প্যারামিটার ছাড়াও, ফ্র্যাগমেন্ট স্ট্রিংয়ে token_type প্যারামিটারও থাকে, যা সবসময় Bearer হিসেবে সেট করা থাকে এবং expires_in প্যারামিটার থাকে, যা টোকেনের লাইফটাইম সেকেন্ডে নির্দিষ্ট করে। অ্যাক্সেস টোকেনের অনুরোধে state প্যারামিটার উল্লেখ করা থাকলে উত্তরেও এর ভ্যালু অন্তর্ভুক্ত করা হয়।

  • সমস্যা সংক্রান্ত উত্তর:
    https://oauth2.example.com/callback#error=access_denied

OAuth 2.0 সার্ভার রেসপন্সের নমুনা

আপনি নিম্নলিখিত নমুনা URL-এ ক্লিক করে এই ফ্লো পরীক্ষা করতে পারেন, যা আপনার Google Drive-এ থাকা ফাইলের মেটাডেটা দেখার জন্য শুধুমাত্র-পঠনযোগ্য অ্যাক্সেস এবং আপনার Google Calendar ইভেন্ট দেখার জন্য শুধুমাত্র-পঠনযোগ্য অ্যাক্সেস অনুরোধ করে:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.force-ssl&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 client_id=client_id

OAuth 2.0 ফ্লো সম্পূর্ণ করার পরে, আপনার ব্রাউজার আপনাকে OAuth 2.0 Playground-এ রিডাইরেক্ট করে, যা OAuth ফ্লো পরীক্ষা করার একটি টুল। আপনি দেখতে পাবেন যে OAuth 2.0 Playground অটোমেটিক অনুমোদন কোড ক্যাপচার করেছে।

ধাপ ৪: ব্যবহারকারী কোন কোন স্কোপের অনুমতি দিয়েছেন তা চেক করুন

একাধিক অনুমতি (স্কোপ) চাওয়ার সময়, ব্যবহারকারী আপনার অ্যাপকে সবকটির অ্যাক্সেস নাও দিতে পারেন। আপনার অ্যাপকে অবশ্যই যাচাই করতে হবে যে কোন কোন স্কোপ আসলে মঞ্জুর করা হয়েছে এবং কিছু অনুমতি অস্বীকার করা হলে পরিস্থিতি সুন্দরভাবে সামলাতে হবে, সাধারণত সেইসব অস্বীকার করা স্কোপের উপর নির্ভর করে ফিচারগুলি বন্ধ করে দিয়ে।

তবে, কিছু ব্যতিক্রম আছে। Google Workspace Enterprise অ্যাপ, যেগুলি ডোমেন-ব্যাপী কর্তৃত্বের ডেলিগেশন-এর সাথে যুক্ত, অথবা বিশ্বস্ত হিসেবে চিহ্নিত, সেগুলি গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন বাইপাস করে। এইসব অ্যাপের ক্ষেত্রে, ব্যবহারকারীরা গ্র্যানুলার অনুমতি সংক্রান্ত সম্মতি স্ক্রিন দেখতে পাবেন না। পরিবর্তে, আপনার অ্যাপ অনুরোধ করা সব স্কোপ পাবে অথবা কিছুই পাবে না।

আরও বিস্তারিত তথ্যের জন্য, কীভাবে গ্র্যানুলার অনুমতি ম্যানেজ করতে হয় দেখুন।

OAuth 2.0 এন্ডপয়েন্ট

ব্যবহারকারী আপনার অ্যাপ্লিকেশনকে কোনও নির্দিষ্ট স্কোপে অ্যাক্সেস দিয়েছেন কিনা তা চেক করতে, অ্যাক্সেস টোকেন রেসপন্সে scope ফিল্ডটি পরীক্ষা করুন। access_token-এর মাধ্যমে মঞ্জুর করা অ্যাক্সেসের স্কোপ স্পেস-ডিলিমিটেড, ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয় এমন স্ট্রিংয়ের তালিকা হিসেবে প্রকাশ করা হয়।

যেমন, অ্যাক্সেস টোকেন সংক্রান্ত উত্তরের নিম্নলিখিত নমুনা থেকে বোঝা যায় যে ব্যবহারকারী আপনার অ্যাপ্লিকেশনকে শুধু-পঠনযোগ্য Drive অ্যাক্টিভিটি ও Calendar ইভেন্ট সংক্রান্ত অনুমতি দিয়েছেন:

  {
    "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
    "expires_in": 3920,
    "token_type": "Bearer",
    "scope": "https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/calendar.readonly",
    "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
  }

Google API কল করা

OAuth 2.0 এন্ডপয়েন্ট

আপনার অ্যাপ্লিকেশন অ্যাক্সেস টোকেন পাওয়ার পরে, আপনি সেই টোকেন ব্যবহার করে কোনও নির্দিষ্ট ব্যবহারকারীর অ্যাকাউন্টের হয়ে Google API-তে কল করতে পারবেন, যদি API-এর প্রয়োজনীয় অ্যাক্সেসের স্কোপ মঞ্জুর করা হয়ে থাকে। এটি করতে, API-তে অনুরোধ করার সময় access_token কোয়েরি প্যারামিটার বা Authorization HTTP হেডার Bearer ভ্যালু যোগ করে অ্যাক্সেস টোকেন অন্তর্ভুক্ত করুন। সম্ভব হলে, HTTP হেডার ব্যবহার করা ভালো, কারণ কোয়েরি স্ট্রিং সার্ভার লগে দেখা যায়। বেশিরভাগ ক্ষেত্রে, Google API-তে কল সেট-আপ করার জন্য আপনি ক্লায়েন্ট লাইব্রেরি ব্যবহার করতে পারেন (যেমন, যখন YouTube Live Streaming API কল করা হয়)।

মনে রাখবেন, YouTube লাইভ স্ট্রিমিং API পরিষেবা অ্যাকাউন্ট ফ্লোতে কাজ করে না। যেহেতু YouTube অ্যাকাউন্টের সাথে কোনও পরিষেবা অ্যাকাউন্ট লিঙ্ক করার কোনও উপায় নেই, তাই এই ফ্লোয়ের মাধ্যমে অনুরোধ অনুমোদনের চেষ্টা করলে NoLinkedYouTubeAccount সমস্যা দেখা দেবে।

আপনি সব Google API ব্যবহার করে দেখতে পারেন এবং OAuth 2.0 Playground-এ সেগুলির স্কোপ দেখতে পারেন।

HTTP GET-এর উদাহরণ

liveBroadcasts.list এন্ডপয়েন্টে (YouTube লাইভ স্ট্রিমিং API) করা কল Authorization: Bearer HTTP হেডার ব্যবহার করলে, সেটি হয়ত এইরকম দেখতে লাগবে। মনে রাখবেন যে আপনাকে নিজের অ্যাক্সেস টোকেন উল্লেখ করতে হবে:

GET /youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

এখানে যাচাই করা ব্যবহারকারীর জন্য একই API-তে কল করা হয়েছে, এর জন্য access_token কোয়েরি স্ট্রিং প্যারামিটার ব্যবহার করা হয়েছে:

GET https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true

curlটি উদাহরণ

আপনি curl কমান্ড-লাইন অ্যাপ্লিকেশন ব্যবহার করে এইসব কমান্ড পরীক্ষা করে দেখতে পারেন। HTTP হেডার বিকল্প (পছন্দসই) ব্যবহার করে এমন একটি উদাহরণ এখানে দেওয়া হল:

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id%2Csnippet&mine=true

অথবা, বিকল্প হিসেবে, কোয়েরি স্ট্রিং প্যারামিটার বিকল্প:

curl https://www.googleapis.com/youtube/v3/liveBroadcasts?access_token=access_token&part=id%2Csnippet&mine=true

JavaScript স্যাম্পেল কোড

নিচে দেওয়া কোড স্নিপেট থেকে বোঝা যাবে যে Google API-তে অনুরোধ পাঠানোর জন্য কীভাবে CORS (ক্রস-অরিজিন রিসোর্স শেয়ারিং) ব্যবহার করতে হয়। এই উদাহরণে JavaScript-এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করা হয়নি। তবে, আপনি ক্লায়েন্ট লাইব্রেরি ব্যবহার না করলেও, সেই লাইব্রেরির ডকুমেন্টেশনে CORS সাপোর্ট সংক্রান্ত নির্দেশিকা আপনাকে এইসব অনুরোধ আরও ভালভাবে বুঝতে সাহায্য করবে।

এই কোড স্নিপেটে, access_token ভেরিয়েবলটি সেই টোকেনকে বোঝায় যা আপনি অনুমোদিত ব্যবহারকারীর হয়ে API অনুরোধ করার জন্য পেয়েছেন। সম্পূর্ণ উদাহরণ থেকে বোঝা যায় যে কীভাবে ব্রাউজারের লোকাল স্টোরেজে টোকেন সেভ করতে হয় এবং API অনুরোধ করার সময় তা রিট্রিভ করতে হয়।

var xhr = new XMLHttpRequest();
xhr.open('GET',
    'https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id,snippet&mine=true' +
    'access_token=' + params['access_token']);
xhr.onreadystatechange = function (e) {
  console.log(xhr.response);
};
xhr.send(null);

সম্পূর্ণ উদাহরণ

OAuth 2.0 এন্ডপয়েন্ট

এই কোড স্যাম্পেল দেখায় যে কীভাবে JavaScript-এ OAuth 2.0 ফ্লো সম্পূর্ণ করতে হয়, এর জন্য JavaScript-এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করা হয় না। এই কোডটি একটি HTML পৃষ্ঠার জন্য যা API অনুরোধ চেষ্টা করার জন্য একটি বোতাম দেখায়। আপনি বোতামে ক্লিক করলে, কোডটি চেক করে দেখে যে পৃষ্ঠাটি আপনার ব্রাউজারের লোকাল স্টোরেজে কোনও API অ্যাক্সেস টোকেন সেভ করেছে কিনা। যদি তাই হয়, তাহলে এটি API অনুরোধ কার্যকর করে। অন্যথায়, এটি OAuth 2.0 ফ্লো শুরু করে।

OAuth 2.0 ফ্লোয়ের জন্য, পৃষ্ঠাটি এইসব ধাপ অনুসরণ করে:

  1. এটি ব্যবহারকারীকে Google-এর OAuth 2.0 সার্ভারে ডাইরেক্ট করে, যেটি https://www.googleapis.com/auth/youtube.force-ssl এবং https://www.googleapis.com/auth/calendar.readonlyস্কোপ অ্যাক্সেস করার অনুরোধ জানায়।
  2. এক বা একাধিক অনুরোধ করা স্কোপে অ্যাক্সেস দেওয়ার (বা না দেওয়ার) পরে, ব্যবহারকারীকে মূল পৃষ্ঠায় রিডাইরেক্ট করা হয়, যা ফ্র্যাগমেন্ট আইডেন্টিফায়ার স্ট্রিং থেকে অ্যাক্সেস টোকেন পার্স করে।
  3. ব্যবহারকারী অ্যাপ্লিকেশনটিকে কোন কোন স্কোপে অ্যাক্সেস দিয়েছেন তা পৃষ্ঠাটি চেক করে।
  4. ব্যবহারকারী অনুরোধ করা স্কোপে() অ্যাক্সেস দিলে, পৃষ্ঠাটি স্যাম্পেল API অনুরোধ করার জন্য অ্যাক্সেস টোকেন ব্যবহার করে।

    এই API অনুরোধ, অনুমোদিত ব্যবহারকারীর YouTube চ্যানেলের জন্য ভিডিও ব্রডকাস্টের একটি তালিকা পেতে YouTube Data API-এর liveBroadcasts.list মেথডকে কল করে।

  5. অনুরোধটি সফলভাবে কার্যকর হলে, API রেসপন্স ব্রাউজারের ডিবাগিং কনসোলে লগ করা হয়।

আপনার Google অ্যাকাউন্টের জন্য অনুমতি পৃষ্ঠা থেকে আপনি অ্যাপের অ্যাক্সেস প্রত্যাহার করতে পারবেন। ক্লায়েন্ট আইডি তৈরি করার সময় OAuth সম্মতি স্ক্রিনের মধ্যে ব্র্যান্ডিং পৃষ্ঠায় যে অ্যাপ্লিকেশনের নাম দেওয়া হয়েছে, সেই নামেই অ্যাপটি তালিকাভুক্ত করা হয়েছে।

এই কোড লোকালি রান করতে, আপনাকে YOUR_CLIENT_ID এবং YOUR_REDIRECT_URI ভেরিয়েবলের জন্য ভ্যালু সেট করতে হবে যা আপনার অনুমোদন ক্রেডেনশিয়াল-এর সাথে সম্পর্কিত। যে URL-এ পৃষ্ঠাটি পরিবেশন করা হচ্ছে, YOUR_REDIRECT_URI ভেরিয়েবলটি সেই URL-এ সেট করতে হবে। এই ভ্যালু OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে সম্পূর্ণভাবে ম্যাচ করতে হবে, যা আপনি Cloud Console ক্লায়েন্ট পৃষ্ঠায় কনফিগার করেছেন। এই ভ্যালু অনুমোদিত URI-এর সাথে ম্যাচ না করলে, আপনি redirect_uri_mismatch সমস্যা দেখতে পাবেন। এছাড়াও, এই অনুরোধের জন্য আপনার প্রোজেক্টে উপযুক্ত API চালু থাকতে হবে।

<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var fragmentString = location.hash.substring(1);
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0 && params['state']) {
    if (params['state'] == localStorage.getItem('state')) {
      localStorage.setItem('oauth2-test-params', JSON.stringify(params) );

      trySampleRequest();
    } else {
      console.log('State mismatch. Possible CSRF attack');
    }
  }

  // Function to generate a random state value
  function generateCryptoRandomState() {
    const randomValues = new Uint32Array(2);
    window.crypto.getRandomValues(randomValues);

    // Encode as UTF-8
    const utf8Encoder = new TextEncoder();
    const utf8Array = utf8Encoder.encode(
      String.fromCharCode.apply(null, randomValues)
    );

    // Base64 encode the UTF-8 data
    return btoa(String.fromCharCode.apply(null, utf8Array))
      .replace(/\+/g, '-')
      .replace(/\//g, '_')
      .replace(/=+$/, '');
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) { 
      // User authorized the request. Now, check which scopes were granted.
      if (params['scope'].includes('https://www.googleapis.com/auth/drive.metadata.readonly')) {
        // User authorized read-only Drive activity permission.
        // Calling the APIs, etc.
        var xhr = new XMLHttpRequest();
        xhr.open('GET',
          'https://www.googleapis.com/youtube/v3/liveBroadcasts?part=id,snippet&mine=true' +
          'access_token=' + params['access_token']);
        xhr.onreadystatechange = function (e) {
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.response);
          } else if (xhr.readyState === 4 && xhr.status === 401) {
            // Token invalid, so prompt for user permission.
            oauth2SignIn();
          }
        };
        xhr.send(null);
      }
      else {
        // User didn't authorize read-only Drive activity permission.
        // Update UX and application accordingly
        console.log('User did not authorize read-only Drive activity permission.');
      }

      // Check if user authorized Calendar read permission.
      if (params['scope'].includes('https://www.googleapis.com/auth/calendar.readonly')) {
        // User authorized Calendar read permission.
        // Calling the APIs, etc.
        console.log('User authorized Calendar read permission.');
      }
      else {
        // User didn't authorize Calendar read permission.
        // Update UX and application accordingly
        console.log('User did not authorize Calendar read permission.');
      } 
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // create random state value and store in local storage
    var state = generateCryptoRandomState();
    localStorage.setItem('state', state);

    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/calendar.readonly',
                  'state': state,
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

জাভাস্ক্রিপ্ট অরিজিন যাচাইকরণ সংক্রান্ত নিয়ম

ডেভেলপারদের অ্যাপ্লিকেশন সুরক্ষিত রাখতে সাহায্য করার জন্য Google, JavaScript অরিজিনে নিম্নলিখিত যাচাইকরণ নিয়ম প্রয়োগ করে। আপনার জাভাস্ক্রিপ্ট অরিজিনকে অবশ্যই এইসব নিয়ম মেনে চলতে হবে। এইসব নিয়মে ব্যবহৃত ডোমেন, হোস্ট ও স্কিমের সংজ্ঞা জানতে RFC 3986-এর বিভাগ ৩ দেখুন।

যাচাইকরণের নিয়ম
স্কিম

জাভাস্ক্রিপ্ট অরিজিনে অবশ্যই HTTPS স্কিম ব্যবহার করতে হবে, সাধারণ HTTP নয়। লোকালহোস্ট URI (লোকালহোস্ট IP অ্যাড্রেস URI সহ) এই নিয়ম থেকে অব্যাহতি পায়।

হোস্ট

হোস্ট কাঁচা IP অ্যাড্রেস হতে পারে না। Localhost IP অ্যাড্রেস এই নিয়মের আওতাভুক্ত নয়।

ডোমেন
  • হোস্ট TLD (টপ লেভেল ডোমেন) অবশ্যই পাবলিক সাফিক্স তালিকার অন্তর্গত হতে হবে।
  • হোস্ট ডোমেন “googleusercontent.com” হতে পারে না।
  • অ্যাপ ডোমেনের মালিক না হলে, জাভাস্ক্রিপ্ট অরিজিন URL ছোট করার ডোমেন (যেমন, goo.gl) থাকতে পারে না।
  • Userinfo

    জাভাস্ক্রিপ্ট অরিজিনে userinfo সাবকম্পোনেন্ট থাকতে পারে না।

    পাথ

    জাভাস্ক্রিপ্ট অরিজিনে পাথ কম্পোনেন্ট থাকতে পারবে না।

    কোয়েরি

    JavaScript অরিজিনে কোয়েরি কম্পোনেন্ট থাকলে চলবে না।

    ফ্র্যাগমেন্ট

    JavaScript অরিজিনে ফ্র্যাগমেন্ট কম্পোনেন্ট থাকতে পারবে না।

    চরিত্র JavaScript অরিজিনে নিম্নলিখিত অক্ষরগুলি সহ নির্দিষ্ট কিছু অক্ষর থাকতে পারে না:
    • ওয়াইল্ডকার্ড অক্ষর ('*')
    • প্রিন্ট করা যায় না এমন ASCII অক্ষর
    • ভুল পার্সেন্ট এনকোডিং (URL-এনকোডিং ফর্ম্যাট অনুসরণ করে না এমন যেকোনও পার্সেন্ট এনকোডিং, অর্থাৎ পার্সেন্ট চিহ্নের পরে দুটি হেক্সাডেসিমেল ডিজিট)
    • নাল অক্ষর (একটি এনকোড করা NULL অক্ষর, যেমন, %00, %C0%80)

    ইনক্রিমেন্টাল অনুমোদন

    OAuth 2.0 প্রোটোকলে, আপনার অ্যাপ রিসোর্স অ্যাক্সেস করার জন্য অনুমোদনের অনুরোধ করে, যা স্কোপের মাধ্যমে শনাক্ত করা হয়। রিসোর্সের প্রয়োজন হলে সেই সময় অনুমোদনের অনুরোধ করাকে ব্যবহারকারীর অভিজ্ঞতা সংক্রান্ত সেরা পদ্ধতি হিসেবে বিবেচনা করা হয়। সেই পদ্ধতি চালু করতে, Google-এর অথরাইজেশন সার্ভার ইনক্রিমেন্টাল অথরাইজেশনকে সমর্থন করে। এই ফিচার আপনাকে প্রয়োজন অনুযায়ী স্কোপের অনুরোধ করতে দেয় এবং ব্যবহারকারী নতুন স্কোপের জন্য অনুমতি দিলে, একটি অথরাইজেশন কোড ফেরত দেয় যা ব্যবহারকারী প্রোজেক্টকে যেসব স্কোপের অনুমতি দিয়েছেন সেগুলি সহ টোকেনের সাথে এক্সচেঞ্জ করা যেতে পারে।

    যেমন, ধরুন কোনও অ্যাপ যাচাই করা ব্যবহারকারীর YouTube চ্যানেলের জন্য ডেটা নিয়ে আসে এবং একটি বিশেষ ফ্লোর মাধ্যমে ব্যবহারকারীকে YouTube Analytics ডেটা নিয়ে আসার সুবিধা দেয়। এই ক্ষেত্রে, সাইন-ইন করার সময়, অ্যাপটি শুধুমাত্র https://www.googleapis.com/auth/youtube.force-ssl স্কোপে অ্যাক্সেসের অনুরোধ করতে পারে। তবে, ব্যবহারকারী তার চ্যানেলের জন্য Analytics ডেটা অ্যাক্সেস করার চেষ্টা করলে, অ্যাপটি https://www.googleapis.com/auth/yt-analytics.readonly স্কোপ অ্যাক্সেস করার জন্য অনুরোধ করতে পারে।

    ইনক্রিমেন্টাল অনুমোদনের মাধ্যমে পাওয়া অ্যাক্সেস টোকেনের ক্ষেত্রে নিম্নলিখিত নিয়ম প্রযোজ্য:

    • নতুন, সম্মিলিত অনুমোদনে অন্তর্ভুক্ত যেকোনও স্কোপের সাথে সম্পর্কিত রিসোর্স অ্যাক্সেস করতে টোকেন ব্যবহার করা যেতে পারে।
    • অ্যাক্সেস টোকেন পাওয়ার জন্য আপনি যখন সম্মিলিত অনুমোদনের জন্য রিফ্রেশ টোকেন ব্যবহার করেন, তখন অ্যাক্সেস টোকেনটি সম্মিলিত অনুমোদনের প্রতিনিধিত্ব করে এবং উত্তরে অন্তর্ভুক্ত scope মানগুলির যেকোনও একটির জন্য ব্যবহার করা যেতে পারে।
    • সম্মিলিত অনুমোদনের মধ্যে সেইসব স্কোপ অন্তর্ভুক্ত থাকে যেগুলি ব্যবহারকারী API প্রোজেক্টকে দিয়েছেন, এমনকি যদি আলাদা আলাদা ক্লায়েন্ট থেকে অনুমোদনের অনুরোধ করা হয়ে থাকে। যেমন, কোনও ব্যবহারকারী যদি কোনও অ্যাপ্লিকেশনের ডেস্কটপ ক্লায়েন্ট ব্যবহার করে একটি স্কোপে অ্যাক্সেস দেন এবং তারপরে মোবাইল ক্লায়েন্টের মাধ্যমে একই অ্যাপ্লিকেশনে অন্য একটি স্কোপে অ্যাক্সেস দেন, তাহলে সম্মিলিত অনুমোদনে দুটি স্কোপই অন্তর্ভুক্ত থাকবে।
    • আপনি যদি এমন কোনও টোকেন প্রত্যাহার করেন যা একটি সম্মিলিত অনুমোদনকে উপস্থাপন করে, তাহলে সংশ্লিষ্ট ব্যবহারকারীর পক্ষে সেই অনুমোদনের সমস্ত স্কোপের অ্যাক্সেস একই সাথে প্রত্যাহার করা হয়।

    আগে থেকে থাকা অ্যাক্সেস টোকেনে কীভাবে স্কোপ যোগ করতে হয় তা নিচের কোড স্যাম্পেল থেকে জানতে পারবেন। এই পদ্ধতিতে আপনার অ্যাপকে একাধিক অ্যাক্সেস টোকেন ম্যানেজ করতে হয় না।

    OAuth 2.0 এন্ডপয়েন্ট

    এই উদাহরণে, কলিং অ্যাপ্লিকেশন ব্যবহারকারীর YouTube ডেটা ফিরিয়ে আনার জন্য অ্যাক্সেসের অনুরোধ করে, এছাড়াও ব্যবহারকারী অ্যাপ্লিকেশনটিকে আগে থেকে যে অ্যাক্সেস দিয়েছেন সেটিও অন্তর্ভুক্ত থাকে।

    আগে থেকে থাকা অ্যাক্সেস টোকেনে স্কোপ যোগ করতে, include_granted_scopes প্যারামিটারটি আপনার Google-এর OAuth 2.0 সার্ভারে করা অনুরোধে অন্তর্ভুক্ত করুন।

    নিম্নলিখিত কোড স্নিপেট থেকে বোঝা যাবে যে এটি কীভাবে করতে হবে। স্ন্যাপেট ধরে নেয় যে আপনি ব্রাউজারের লোকাল স্টোরেজে আপনার অ্যাক্সেস টোকেন বৈধ এমন স্কোপ স্টোর করেছেন। (সম্পূর্ণ উদাহরণ কোডটি ব্রাউজারের লোকাল স্টোরেজে oauth2-test-params.scope প্রপার্টি সেট করার মাধ্যমে অ্যাক্সেস টোকেন বৈধ এমন স্কোপের একটি তালিকা স্টোর করে।)

    স্নিপেটটি সেই স্কোপের তুলনা করে যার জন্য অ্যাক্সেস টোকেনটি আপনার ব্যবহার করতে চাওয়া স্কোপের জন্য বৈধ একটি নির্দিষ্ট কোয়েরির জন্য। অ্যাক্সেস টোকেন সেই স্কোপ কভার না করলে, OAuth 2.0 ফ্লো শুরু হয়। এখানে, oauth2SignIn ফাংশনটি ধাপ ২-এ (এবং পরে সম্পূর্ণ উদাহরণ-এ) প্রদান করা ফাংশনের মতোই।

    var SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    টোকেন প্রত্যাহার

    কিছু ক্ষেত্রে, কোনও ব্যবহারকারী কোনও অ্যাপ্লিকেশনে দেওয়া অ্যাক্সেস প্রত্যাহার করতে চাইতে পারেন। ব্যবহারকারী অ্যাকাউন্ট সেটিংস-এ গিয়ে অ্যাক্সেস প্রত্যাহার করতে পারবেন। আরও তথ্যের জন্য আপনার অ্যাকাউন্টে অ্যাক্সেস আছে এমন থার্ড-পার্টি সাইট ও অ্যাপের সাইট বা অ্যাপ অ্যাক্সেস সরান সহায়তা ডকুমেন্ট দেখুন।

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

    OAuth 2.0 এন্ডপয়েন্ট

    প্রোগ্রাম্যাটিক্যালি টোকেন তুলে নিতে, আপনার অ্যাপ্লিকেশন https://oauth2.googleapis.com/revoke-এ অনুরোধ করে এবং প্যারামিটার হিসেবে টোকেন অন্তর্ভুক্ত করে:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    টোকেনটি অ্যাক্সেস টোকেন বা রিফ্রেশ টোকেন হতে পারে। টোকেনটি যদি অ্যাক্সেস টোকেন হয় এবং সেটির সাথে সংশ্লিষ্ট রিফ্রেশ টোকেন থাকে, তাহলে রিফ্রেশ টোকেনটিও বাতিল করা হবে।

    প্রত্যাহার করার অনুরোধ সফলভাবে প্রসেস করা হলে, উত্তরের HTTP স্ট্যাটাস কোড হল 200। সমস্যার ক্ষেত্রে, সমস্যার কোডের সাথে HTTP স্ট্যাটাস কোড 400 রিটার্ন করা হয়।

    নিম্নলিখিত জাভাস্ক্রিপ্ট স্নিপেট দেখায় যে কীভাবে জাভাস্ক্রিপ্টে Google APIs ক্লায়েন্ট লাইব্রেরি ফর জাভাস্ক্রিপ্ট ব্যবহার না করে টোকেন প্রত্যাহার করতে হয়। যেহেতু টোকেন তুলে নেওয়ার জন্য Google-এর OAuth 2.0 এন্ডপয়েন্ট ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) সমর্থন করে না, তাই কোডটি একটি ফর্ম তৈরি করে এবং অনুরোধ পোস্ট করার জন্য XMLHttpRequest() পদ্ধতি ব্যবহার করার পরিবর্তে এন্ডপয়েন্টে ফর্মটি জমা দেয়।

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }

    'ক্রস-অ্যাকাউন্ট সুরক্ষা' ফিচার প্রয়োগ করা

    আপনার ব্যবহারকারীদের অ্যাকাউন্ট সুরক্ষিত রাখতে আপনাকে একটি অতিরিক্ত পদক্ষেপ নিতে হবে, সেটি হল Google-এর ক্রস-অ্যাকাউন্ট সুরক্ষা পরিষেবা ব্যবহার করে ক্রস-অ্যাকাউন্ট সুরক্ষা প্রয়োগ করা। এই পরিষেবা আপনাকে নিরাপত্তা সংক্রান্ত ইভেন্টের বিজ্ঞপ্তিতে সাবস্ক্রাইব করতে দেয় যা আপনার অ্যাপ্লিকেশনকে ব্যবহারকারীর অ্যাকাউন্টে বড় পরিবর্তন সম্পর্কে তথ্য প্রদান করে। আপনি ইভেন্টে কীভাবে প্রতিক্রিয়া জানাবেন তার উপর নির্ভর করে অ্যাকশন নিতে এই তথ্য ব্যবহার করতে পারেন।

    Google-এর ক্রস-অ্যাকাউন্ট সুরক্ষা পরিষেবা আপনার অ্যাপে যে ধরনের ইভেন্ট পাঠায় তার কিছু উদাহরণ হল:

    • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
    • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
    • https://schemas.openid.net/secevent/risc/event-type/account-disabled

    ক্রস-অ্যাকাউন্ট সুরক্ষা কীভাবে প্রয়োগ করবেন এবং উপলভ্য ইভেন্টের সম্পূর্ণ তালিকা সম্পর্কে আরও তথ্য পেতে ক্রস-অ্যাকাউন্ট সুরক্ষার মাধ্যমে ব্যবহারকারীর অ্যাকাউন্ট সুরক্ষিত করুন পৃষ্ঠা দেখুন।