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

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

OAuth 2.0 ব্যবহারকারীদের তাদের ব্যবহারকারীর নাম, পাসওয়ার্ড এবং অন্যান্য তথ্য গোপন রেখে একটি অ্যাপ্লিকেশনের সাথে নির্দিষ্ট ডেটা ভাগ করার অনুমতি দেয়৷ উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন ব্যবহারকারীর YouTube চ্যানেলে ভিডিও আপলোড করার অনুমতি পেতে OAuth 2.0 ব্যবহার করতে পারে৷

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

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

ক্লায়েন্ট লাইব্রেরি

এই পৃষ্ঠার ভাষা-নির্দিষ্ট উদাহরণগুলি OAuth 2.0 অনুমোদন কার্যকর করতে Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে। কোড নমুনা চালানোর জন্য, আপনাকে প্রথমে আপনার ভাষার জন্য ক্লায়েন্ট লাইব্রেরি ইনস্টল করতে হবে।

যখন আপনি আপনার অ্যাপ্লিকেশনের OAuth 2.0 ফ্লো পরিচালনা করার জন্য একটি Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তখন ক্লায়েন্ট লাইব্রেরি এমন অনেকগুলি কাজ করে যা অ্যাপ্লিকেশনটিকে অন্যথায় নিজে থেকে পরিচালনা করতে হবে৷ উদাহরণস্বরূপ, এটি নির্ধারণ করে যে কখন অ্যাপ্লিকেশনটি সঞ্চিত অ্যাক্সেস টোকেনগুলি ব্যবহার বা রিফ্রেশ করতে পারে সেইসাথে কখন অ্যাপ্লিকেশনটিকে পুনরায় সম্মতি নিতে হবে। ক্লায়েন্ট লাইব্রেরি সঠিক রিডাইরেক্ট ইউআরএল তৈরি করে এবং রিডাইরেক্ট হ্যান্ডলার প্রয়োগ করতে সাহায্য করে যা অ্যাক্সেস টোকেনের জন্য অনুমোদন কোড বিনিময় করে।

সার্ভার-সাইড অ্যাপ্লিকেশনগুলির জন্য Google API ক্লায়েন্ট লাইব্রেরিগুলি নিম্নলিখিত ভাষার জন্য উপলব্ধ:

পূর্বশর্ত

আপনার প্রকল্পের জন্য API সক্ষম করুন

Google API-কে কল করে এমন যেকোনো অ্যাপ্লিকেশনে সেই APIগুলিকে সক্ষম করতে হবে৷ API Console.

আপনার প্রকল্পের জন্য একটি API সক্ষম করতে:

  1. Open the API Library মধ্যে Google API Console.
  2. If prompted, select a project, or create a new one.
  3. YouTube ডেটা API খুঁজে পেতে এবং সক্ষম করতে লাইব্রেরি পৃষ্ঠা ব্যবহার করুন৷ আপনার অ্যাপ্লিকেশন ব্যবহার করবে এমন অন্য যেকোন এপিআই খুঁজুন এবং সেগুলিকেও সক্ষম করুন।

অনুমোদনের শংসাপত্র তৈরি করুন

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

  1. Go to the Credentials page.
  2. ক্রেডেনশিয়াল তৈরি করুন > OAuth ক্লায়েন্ট আইডি ক্লিক করুন।
  3. ওয়েব অ্যাপ্লিকেশন অ্যাপ্লিকেশন প্রকার নির্বাচন করুন.
  4. ফর্মটি পূরণ করুন এবং তৈরি করুন ক্লিক করুন। PHP, Java, Python, Ruby, এবং .NET এর মত ভাষা এবং ফ্রেমওয়ার্ক ব্যবহার করে এমন অ্যাপ্লিকেশনগুলিকে অবশ্যই অনুমোদিত রিডাইরেক্ট URI উল্লেখ করতে হবে। রিডাইরেক্ট ইউআরআই হল শেষ পয়েন্ট যেখানে OAuth 2.0 সার্ভার প্রতিক্রিয়া পাঠাতে পারে। এই শেষ পয়েন্টগুলি অবশ্যই Google-এর বৈধতা নিয়ম মেনে চলতে হবে৷

    পরীক্ষার জন্য, আপনি URI উল্লেখ করতে পারেন যা স্থানীয় মেশিনে উল্লেখ করে, যেমন http://localhost:8080 । এটি মনে রেখে, অনুগ্রহ করে মনে রাখবেন যে এই নথির সমস্ত উদাহরণ http://localhost:8080 পুনঃনির্দেশ URI হিসাবে ব্যবহার করে।

    আমরা সুপারিশ করি যে আপনি আপনার অ্যাপের প্রমাণীকরণের শেষ পয়েন্টগুলি ডিজাইন করুন যাতে আপনার অ্যাপ্লিকেশনটি পৃষ্ঠার অন্যান্য সংস্থানগুলিতে অনুমোদনের কোডগুলি প্রকাশ না করে৷

আপনার শংসাপত্র তৈরি করার পরে, থেকে client_secret.json ফাইলটি ডাউনলোড করুন API Console. ফাইলটিকে নিরাপদে এমন একটি স্থানে সংরক্ষণ করুন যেখানে শুধুমাত্র আপনার অ্যাপ্লিকেশন অ্যাক্সেস করতে পারে।

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

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

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

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

YouTube ডেটা 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 অ্যাক্সেস করতে ব্যবহার করতে পারেন।

ভাষা-নির্দিষ্ট প্রয়োজনীয়তা

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

পিএইচপি

এই নথিতে পিএইচপি কোড নমুনা চালানোর জন্য, আপনার প্রয়োজন হবে:

  • কমান্ড-লাইন ইন্টারফেস (CLI) এবং JSON এক্সটেনশন ইনস্টল সহ PHP 5.6 বা তার বেশি।
  • কম্পোজার নির্ভরতা ব্যবস্থাপনা টুল।
  • PHP-এর জন্য Google APIs ক্লায়েন্ট লাইব্রেরি:

    composer require google/apiclient:^2.10

পাইথন

এই নথিতে পাইথন কোড নমুনা চালানোর জন্য, আপনার প্রয়োজন হবে:

  • Python 2.6 বা তার বেশি
  • পাইপ প্যাকেজ ম্যানেজমেন্ট টুল।
  • পাইথনের জন্য Google APIs ক্লায়েন্ট লাইব্রেরি:
    pip install --upgrade google-api-python-client
  • ব্যবহারকারীর অনুমোদনের জন্য google-auth , google-auth-oauthlib এবং google-auth-httplib2
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • ফ্লাস্ক পাইথন ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক।
    pip install --upgrade flask
  • requests HTTP লাইব্রেরি.
    pip install --upgrade requests

রুবি

এই নথিতে রুবি কোড নমুনা চালানোর জন্য, আপনার প্রয়োজন হবে:

  • রুবি 2.6 বা তার বেশি
  • রুবির জন্য Google Auth লাইব্রেরি:

    gem install googleauth
  • সিনাট্রা রুবি ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক।

    gem install sinatra

Node.js

এই নথিতে Node.js কোড নমুনা চালানোর জন্য, আপনার প্রয়োজন হবে:

  • রক্ষণাবেক্ষণ এলটিএস, সক্রিয় এলটিএস, বা Node.js-এর বর্তমান প্রকাশ।
  • Google APIs Node.js ক্লায়েন্ট:

    npm install googleapis crypto express express-session

HTTP/REST

OAuth 2.0 এন্ডপয়েন্টে সরাসরি কল করতে আপনাকে কোনো লাইব্রেরি ইনস্টল করার দরকার নেই।

OAuth 2.0 অ্যাক্সেস টোকেন প্রাপ্ত করা

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

নীচের তালিকাটি দ্রুত এই পদক্ষেপগুলিকে সংক্ষিপ্ত করে:

  1. আপনার অ্যাপ্লিকেশনটি প্রয়োজনীয় অনুমতিগুলি সনাক্ত করে৷
  2. আপনার অ্যাপ্লিকেশন ব্যবহারকারীকে অনুরোধ করা অনুমতিগুলির তালিকা সহ Google-এ পুনঃনির্দেশ করে৷
  3. ব্যবহারকারী আপনার আবেদনের অনুমতি প্রদান করবেন কিনা তা সিদ্ধান্ত নেয়।
  4. আপনার অ্যাপ্লিকেশন ব্যবহারকারী কি সিদ্ধান্ত নিয়েছে খুঁজে বের করে.
  5. ব্যবহারকারী অনুরোধকৃত অনুমতি প্রদান করলে, আপনার অ্যাপ্লিকেশন ব্যবহারকারীর পক্ষ থেকে API অনুরোধ করার জন্য প্রয়োজনীয় টোকেন পুনরুদ্ধার করে।

ধাপ 1: অনুমোদনের পরামিতি সেট করুন

আপনার প্রথম ধাপ হল অনুমোদনের অনুরোধ তৈরি করা। এই অনুরোধটি এমন প্যারামিটার সেট করে যা আপনার অ্যাপ্লিকেশনকে শনাক্ত করে এবং ব্যবহারকারীকে আপনার আবেদনে মঞ্জুর করতে বলা হবে এমন অনুমতিগুলিকে সংজ্ঞায়িত করে৷

  • আপনি যদি OAuth 2.0 প্রমাণীকরণ এবং অনুমোদনের জন্য একটি Google ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, আপনি একটি বস্তু তৈরি এবং কনফিগার করেন যা এই পরামিতিগুলিকে সংজ্ঞায়িত করে৷
  • আপনি যদি সরাসরি Google OAuth 2.0 এন্ডপয়েন্টে কল করেন, তাহলে আপনি একটি URL তৈরি করবেন এবং সেই URL-এ প্যারামিটার সেট করবেন।

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

পিএইচপি

নীচের কোড স্নিপেটটি একটি Google\Client() অবজেক্ট তৈরি করে, যা অনুমোদনের অনুরোধে পরামিতিগুলিকে সংজ্ঞায়িত করে।

সেই বস্তুটি আপনার অ্যাপ্লিকেশন সনাক্ত করতে আপনার client_secret.json ফাইল থেকে তথ্য ব্যবহার করে। (সেই ফাইলটি সম্পর্কে আরও তথ্যের জন্য অনুমোদনের শংসাপত্র তৈরি করা দেখুন।) বস্তুটি সেই সুযোগগুলিকেও চিহ্নিত করে যা আপনার অ্যাপ্লিকেশন অ্যাক্সেসের অনুমতির জন্য অনুরোধ করছে এবং আপনার অ্যাপ্লিকেশনের প্রমাণীকরণের শেষ পয়েন্টের URL, যা Google এর OAuth 2.0 সার্ভার থেকে প্রতিক্রিয়া পরিচালনা করবে। অবশেষে, কোড ঐচ্ছিক access_type এবং include_granted_scopes প্যারামিটার সেট করে।

উদাহরণস্বরূপ, এই কোডটি একজন ব্যবহারকারীর YouTube অ্যাকাউন্ট পরিচালনা করতে অফলাইন অ্যাক্সেসের অনুরোধ করে:

$client = new Google\Client();

// Required, call the setAuthConfig function to load authorization credentials from
// client_secret.json file.
$client->setAuthConfig('client_secret.json');

// Required, to set the scope value, call the addScope function
$client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL);

// Required, call the setRedirectUri function to specify a valid redirect URI for the
// provided client_id
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');

// Recommended, offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');

// Recommended, call the setState function. Using a state value can increase your assurance that
// an incoming connection is the result of an authentication request.
$client->setState($sample_passthrough_value);

// Optional, if your application knows which user is trying to authenticate, it can use this
// parameter to provide a hint to the Google Authentication Server.
$client->setLoginHint('hint@example.com');

// Optional, call the setPrompt function to set "consent" will prompt the user for consent
$client->setPrompt('consent');

// Optional, call the setIncludeGrantedScopes function with true to enable incremental
// authorization
$client->setIncludeGrantedScopes(true);

পাইথন

নিম্নলিখিত কোড স্নিপেট অনুমোদনের অনুরোধ তৈরি করতে google-auth-oauthlib.flow মডিউল ব্যবহার করে।

কোডটি একটি Flow অবজেক্ট তৈরি করে, যা আপনার অনুমোদনের শংসাপত্র তৈরি করার পরে ডাউনলোড করা client_secret.json ফাইল থেকে তথ্য ব্যবহার করে আপনার অ্যাপ্লিকেশনটিকে সনাক্ত করে। সেই অবজেক্টটি সেই স্কোপগুলিকেও শনাক্ত করে যা আপনার অ্যাপ্লিকেশন অ্যাক্সেসের অনুমতির জন্য অনুরোধ করছে এবং আপনার অ্যাপ্লিকেশনের প্রমাণীকরণের শেষ পয়েন্টের URL, যা Google এর OAuth 2.0 সার্ভার থেকে প্রতিক্রিয়া পরিচালনা করবে। অবশেষে, কোড ঐচ্ছিক access_type এবং include_granted_scopes প্যারামিটার সেট করে।

উদাহরণস্বরূপ, এই কোডটি একজন ব্যবহারকারীর YouTube অ্যাকাউন্ট পরিচালনা করতে অফলাইন অ্যাক্সেসের অনুরোধ করে:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Required, call the from_client_secrets_file method to retrieve the client ID from a
# client_secret.json file. The client ID (from that file) and access scopes are required. (You can
# also use the from_client_config method, which passes the client configuration as it originally
# appeared in a client secrets file but doesn't access the file itself.)
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/youtube.force-ssl'])

# Required, indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
flow.redirect_uri = 'https://www.example.com/oauth2callback'

# Generate URL for request to Google's OAuth 2.0 server.
# Use kwargs to set optional request parameters.
authorization_url, state = flow.authorization_url(
    # Recommended, enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Optional, enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true',
    # Optional, if your application knows which user is trying to authenticate, it can use this
    # parameter to provide a hint to the Google Authentication Server.
    login_hint='hint@example.com',
    # Optional, set prompt to 'consent' will prompt the user for consent
    prompt='consent')

রুবি

আপনার অ্যাপ্লিকেশনে একটি ক্লায়েন্ট অবজেক্ট কনফিগার করতে আপনার তৈরি করা client_secrets.json ফাইলটি ব্যবহার করুন। আপনি যখন একটি ক্লায়েন্ট অবজেক্ট কনফিগার করেন, তখন আপনি আপনার অ্যাপ্লিকেশনের প্রমাণীকরণ এন্ডপয়েন্টের URL সহ আপনার অ্যাপ্লিকেশনের অ্যাক্সেস করার জন্য প্রয়োজনীয় সুযোগগুলি নির্দিষ্ট করেন, যা OAuth 2.0 সার্ভার থেকে প্রতিক্রিয়া পরিচালনা করবে।

উদাহরণস্বরূপ, এই কোডটি একজন ব্যবহারকারীর YouTube অ্যাকাউন্ট পরিচালনা করতে অফলাইন অ্যাক্সেসের অনুরোধ করে:

require 'google/apis/youtube_v3'
require "googleauth"
require 'googleauth/stores/redis_token_store'

client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json')
scope = 'https://www.googleapis.com/auth/youtube.force-ssl'
token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, '/oauth2callback')

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

Node.js

নিম্নলিখিত কোড স্নিপেট একটি google.auth.OAuth2 অবজেক্ট তৈরি করে, যা অনুমোদনের অনুরোধে পরামিতিগুলিকে সংজ্ঞায়িত করে৷

সেই বস্তুটি আপনার অ্যাপ্লিকেশন সনাক্ত করতে আপনার client_secret.json ফাইল থেকে তথ্য ব্যবহার করে। একটি অ্যাক্সেস টোকেন পুনরুদ্ধার করার জন্য একটি ব্যবহারকারীর কাছ থেকে অনুমতি চাইতে, আপনি তাদের একটি সম্মতি পৃষ্ঠায় পুনঃনির্দেশিত করুন। একটি সম্মতি পৃষ্ঠার URL তৈরি করতে:

const {google} = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
 * from the client_secret.json file. To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a secure random state value.
const state = crypto.randomBytes(32).toString('hex');

// Store state in the session
req.session.state = state;

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true,
  // Include the state parameter to reduce the risk of CSRF attacks.
  state: state
});

গুরুত্বপূর্ণ দ্রষ্টব্য - refresh_token শুধুমাত্র প্রথম অনুমোদনে ফেরত দেওয়া হয়। এখানে আরো বিস্তারিত.

HTTP/REST

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

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

পরামিতি
client_id প্রয়োজন

আপনার আবেদনের জন্য ক্লায়েন্ট আইডি। আপনি এই মান খুঁজে পেতে পারেন API ConsoleCredentials page.

redirect_uri প্রয়োজন

ব্যবহারকারী অনুমোদন প্রবাহ সম্পূর্ণ করার পরে API সার্ভার ব্যবহারকারীকে কোথায় রিডাইরেক্ট করে তা নির্ধারণ করে। মানটি অবশ্যই OAuth 2.0 ক্লায়েন্টের জন্য অনুমোদিত রিডাইরেক্ট ইউআরআইগুলির একটির সাথে মিলতে হবে, যা আপনি আপনার ক্লায়েন্টের কনফিগার করেছেন API ConsoleCredentials page. যদি এই মানটি প্রদত্ত client_id জন্য একটি অনুমোদিত পুনঃনির্দেশ URI-এর সাথে মেলে না তাহলে আপনি একটি redirect_uri_mismatch ত্রুটি পাবেন।

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

response_type প্রয়োজন

Google OAuth 2.0 এন্ডপয়েন্ট একটি অনুমোদন কোড প্রদান করে কিনা তা নির্ধারণ করে।

ওয়েব সার্ভার অ্যাপ্লিকেশনের জন্য code প্যারামিটার মান সেট করুন।

scope প্রয়োজন

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

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

YouTube ডেটা 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 অ্যাক্সেস করতে ব্যবহার করতে পারেন।

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

access_type প্রস্তাবিত

ব্যবহারকারী ব্রাউজারে উপস্থিত না থাকলে আপনার অ্যাপ্লিকেশন অ্যাক্সেস টোকেন রিফ্রেশ করতে পারে কিনা তা নির্দেশ করে৷ বৈধ প্যারামিটার মানগুলি online , যা ডিফল্ট মান এবং offline

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

state প্রস্তাবিত

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

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

include_granted_scopes ঐচ্ছিক

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

login_hint ঐচ্ছিক

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

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

prompt ঐচ্ছিক

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

সম্ভাব্য মান হল:

none কোনো প্রমাণীকরণ বা সম্মতি স্ক্রীন প্রদর্শন করবেন না। অন্যান্য মানের সাথে নির্দিষ্ট করা উচিত নয়।
consent ব্যবহারকারীকে সম্মতির জন্য অনুরোধ করুন।
select_account ব্যবহারকারীকে একটি অ্যাকাউন্ট নির্বাচন করতে অনুরোধ করুন।

ধাপ 2: Google এর OAuth 2.0 সার্ভারে পুনঃনির্দেশ করুন

প্রমাণীকরণ এবং অনুমোদন প্রক্রিয়া শুরু করতে ব্যবহারকারীকে Google এর OAuth 2.0 সার্ভারে পুনঃনির্দেশ করুন৷ সাধারণত, এটি ঘটে যখন আপনার অ্যাপ্লিকেশনটিকে প্রথমে ব্যবহারকারীর ডেটা অ্যাক্সেস করতে হবে৷ ক্রমবর্ধমান অনুমোদনের ক্ষেত্রে, এই পদক্ষেপটি তখনও ঘটে যখন আপনার অ্যাপ্লিকেশনটিকে প্রথমে অতিরিক্ত সংস্থানগুলি অ্যাক্সেস করতে হবে যেগুলি অ্যাক্সেস করার অনুমতি এখনও নেই৷

পিএইচপি

  1. Google এর OAuth 2.0 সার্ভার থেকে অ্যাক্সেসের অনুরোধ করার জন্য একটি URL তৈরি করুন:
    $auth_url = $client->createAuthUrl();
  2. ব্যবহারকারীকে $auth_url এ রিডাইরেক্ট করুন:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

পাইথন

এই উদাহরণটি দেখায় কিভাবে ব্যবহারকারীকে ফ্লাস্ক ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক ব্যবহার করে অনুমোদনের URL-এ পুনঃনির্দেশ করা যায়:

return flask.redirect(authorization_url)

রুবি

  1. Google এর OAuth 2.0 সার্ভার থেকে অ্যাক্সেসের অনুরোধ করার জন্য একটি URL তৈরি করুন:
    auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
  2. ব্যবহারকারীকে auth_uri এ পুনঃনির্দেশ করুন।

Node.js

  1. Google-এর OAuth 2.0 সার্ভার থেকে অ্যাক্সেসের অনুরোধ করতে ধাপ 1 generateAuthUrl পদ্ধতি থেকে জেনারেট করা URL authorizationUrl ব্যবহার করুন।
  2. ব্যবহারকারীকে authorizationUrl এ পুনঃনির্দেশ করুন।
    res.redirect(authorizationUrl);

HTTP/REST

Sample redirect to Google's authorization server

The sample URL below requests offline access (access_type=offline) to a scope that permits access to view the user's YouTube account. It uses incremental authorization to ensure that the new access token covers any scopes to which the user previously granted the application access. The URL also sets values for the required redirect_uri, response_type, and client_id parameters as well as for the state parameter. The URL contains line breaks and spaces for readability.

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

আপনি অনুরোধ URL তৈরি করার পরে, ব্যবহারকারীকে এটিতে পুনঃনির্দেশ করুন।

Google-এর OAuth 2.0 সার্ভার ব্যবহারকারীকে প্রমাণীকরণ করে এবং অনুরোধ করা স্কোপগুলি অ্যাক্সেস করার জন্য আপনার আবেদনের জন্য ব্যবহারকারীর কাছ থেকে সম্মতি নেয়। আপনার নির্দিষ্ট করা পুনঃনির্দেশ URL ব্যবহার করে প্রতিক্রিয়াটি আপনার অ্যাপ্লিকেশনে ফেরত পাঠানো হয়।

ধাপ 3: Google ব্যবহারকারীকে সম্মতির জন্য অনুরোধ করে

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

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

ত্রুটি

Google-এর OAuth 2.0 অনুমোদনের এন্ডপয়েন্টের অনুরোধগুলি প্রত্যাশিত প্রমাণীকরণ এবং অনুমোদনের প্রবাহের পরিবর্তে ব্যবহারকারী-মুখী ত্রুটি বার্তাগুলি প্রদর্শন করতে পারে৷ সাধারণ ত্রুটি কোড এবং প্রস্তাবিত রেজোলিউশন নীচে তালিকাভুক্ত করা হয়.

admin_policy_enforced

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

disallowed_useragent

অনুমোদনের এন্ডপয়েন্টটি Google-এর OAuth 2.0 নীতি দ্বারা অনুমোদিত একটি এমবেডেড ব্যবহারকারী-এজেন্টের ভিতরে প্রদর্শিত হয়৷

অ্যান্ড্রয়েড

android.webkit.WebView এ অনুমোদনের অনুরোধগুলি খোলার সময় Android বিকাশকারীরা এই ত্রুটির বার্তাটির সম্মুখীন হতে পারে৷ বিকাশকারীদের পরিবর্তে Android লাইব্রেরিগুলি ব্যবহার করা উচিত যেমন Android এর জন্য Google সাইন-ইন বা Android এর জন্য OpenID ফাউন্ডেশনের AppAuth

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

iOS

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

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

org_internal

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

invalid_client

OAuth ক্লায়েন্ট সিক্রেটটি ভুল। এই অনুরোধের জন্য ব্যবহৃত ক্লায়েন্ট আইডি এবং গোপনীয়তা সহ OAuth ক্লায়েন্ট কনফিগারেশন পর্যালোচনা করুন।

invalid_grant

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

redirect_uri_mismatch

অনুমোদনের অনুরোধে পাস করা redirect_uri OAuth ক্লায়েন্ট আইডির জন্য অনুমোদিত রিডাইরেক্ট URI-এর সাথে মেলে না। তে অনুমোদিত পুনঃনির্দেশ ইউআরআই পর্যালোচনা করুন৷ Google API Console Credentials page.

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

invalid_request

আপনার অনুরোধে কিছু ভুল ছিল। এটি বেশ কয়েকটি কারণে হতে পারে:

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

ধাপ 4: OAuth 2.0 সার্ভার প্রতিক্রিয়া পরিচালনা করুন

OAuth 2.0 সার্ভার অনুরোধে উল্লেখিত URL ব্যবহার করে আপনার অ্যাপ্লিকেশনের অ্যাক্সেসের অনুরোধে সাড়া দেয়।

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

একটি ত্রুটি প্রতিক্রিয়া:

https://oauth2.example.com/auth?error=access_denied

একটি অনুমোদন কোড প্রতিক্রিয়া:

https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

নমুনা OAuth 2.0 সার্ভার প্রতিক্রিয়া

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

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

OAuth 2.0 ফ্লো সম্পূর্ণ করার পরে, আপনাকে http://localhost/oauth2callback এ পুনঃনির্দেশিত করা উচিত, যা সম্ভবত একটি 404 NOT FOUND ত্রুটি প্রদান করবে যদি না আপনার স্থানীয় মেশিন সেই ঠিকানায় একটি ফাইল পরিবেশন করে। পরবর্তী ধাপে ইউআরআই-এ ফেরত দেওয়া তথ্য সম্পর্কে আরও বিশদ প্রদান করা হয় যখন ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনে ফেরত পাঠানো হয়।

ধাপ 5: রিফ্রেশ এবং অ্যাক্সেস টোকেনগুলির জন্য এক্সচেঞ্জ অনুমোদন কোড

ওয়েব সার্ভার অনুমোদন কোড পাওয়ার পরে, এটি একটি অ্যাক্সেস টোকেনের জন্য অনুমোদন কোড বিনিময় করতে পারে।

পিএইচপি

একটি অ্যাক্সেস টোকেনের জন্য একটি অনুমোদন কোড বিনিময় করতে, authenticate পদ্ধতি ব্যবহার করুন:

$client->authenticate($_GET['code']);

আপনি getAccessToken পদ্ধতির মাধ্যমে অ্যাক্সেস টোকেন পুনরুদ্ধার করতে পারেন:

$access_token = $client->getAccessToken();

পাইথন

আপনার কলব্যাক পৃষ্ঠায়, অনুমোদন সার্ভার প্রতিক্রিয়া যাচাই করতে google-auth লাইব্রেরি ব্যবহার করুন৷ তারপর, একটি অ্যাক্সেস টোকেনের জন্য সেই প্রতিক্রিয়াতে অনুমোদন কোড বিনিময় করতে flow.fetch_token পদ্ধতিটি ব্যবহার করুন:

state = flask.session['state']
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/youtube.force-ssl'],
    state=state)
flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

authorization_response = flask.request.url
flow.fetch_token(authorization_response=authorization_response)

# Store the credentials in the session.
# ACTION ITEM for developers:
#     Store user's access and refresh tokens in your data store if
#     incorporating this code into your real app.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'token_uri': credentials.token_uri,
    'client_id': credentials.client_id,
    'client_secret': credentials.client_secret,
    'scopes': credentials.scopes}

রুবি

আপনার কলব্যাক পৃষ্ঠায়, অনুমোদন সার্ভার প্রতিক্রিয়া যাচাই করতে googleauth লাইব্রেরি ব্যবহার করুন৷ অনুমোদন কোড সংরক্ষণ করতে authorizer.handle_auth_callback_deferred পদ্ধতি ব্যবহার করুন এবং মূল অনুমোদনের অনুরোধ করা URL-এ পুনরায় নির্দেশ করুন৷ এটি ব্যবহারকারীর সেশনে ফলাফলগুলিকে সাময়িকভাবে লুকিয়ে রেখে কোডের বিনিময় স্থগিত করে৷

  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url

Node.js

একটি অ্যাক্সেস টোকেনের জন্য একটি অনুমোদন কোড বিনিময় করতে, getToken পদ্ধতি ব্যবহার করুন:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
app.get('/oauth2callback', async (req, res) => {
  let q = url.parse(req.url, true).query;

  if (q.error) { // An error response e.g. error=access_denied
    console.log('Error:' + q.error);
  } else if (q.state !== req.session.state) { //check state value
    console.log('State mismatch. Possible CSRF attack');
    res.end('State mismatch. Possible CSRF attack');
  } else { // Get access and refresh tokens (if access_type is offline)

    let { tokens } = await oauth2Client.getToken(q.code);
    oauth2Client.setCredentials(tokens);
});

HTTP/REST

একটি অ্যাক্সেস টোকেনের জন্য একটি অনুমোদন কোড বিনিময় করতে, https://oauth2.googleapis.com/token এন্ডপয়েন্টে কল করুন এবং নিম্নলিখিত প্যারামিটারগুলি সেট করুন:

ক্ষেত্র
client_id ক্লায়েন্ট আইডি থেকে প্রাপ্ত API ConsoleCredentials page.
client_secret ক্লায়েন্ট সিক্রেট থেকে প্রাপ্ত API ConsoleCredentials page.
code অনুমোদন কোড প্রাথমিক অনুরোধ থেকে ফিরে.
grant_type OAuth 2.0 স্পেসিফিকেশনে যেমন সংজ্ঞায়িত করা হয়েছে , এই ক্ষেত্রের মান অবশ্যই authorization_code এ সেট করতে হবে।
redirect_uri আপনার প্রোজেক্টের জন্য তালিকাভুক্ত রিডাইরেক্ট ইউআরআইগুলির মধ্যে একটি API ConsoleCredentials page প্রদত্ত client_id জন্য।

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

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

Google একটি JSON অবজেক্ট ফেরত দিয়ে এই অনুরোধে সাড়া দেয় যাতে একটি স্বল্পকালীন অ্যাক্সেস টোকেন এবং একটি রিফ্রেশ টোকেন রয়েছে। মনে রাখবেন যে রিফ্রেশ টোকেনটি শুধুমাত্র তখনই ফেরত দেওয়া হয় যখন আপনার অ্যাপ্লিকেশন Google-এর অনুমোদন সার্ভারে প্রাথমিক অনুরোধে access_type প্যারামিটারটিকে offline সেট করে।

প্রতিক্রিয়াতে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

ক্ষেত্র
access_token একটি Google API অনুরোধ অনুমোদন করার জন্য আপনার অ্যাপ্লিকেশন যে টোকেন পাঠায়।
expires_in সেকেন্ডে অ্যাক্সেস টোকেনের অবশিষ্ট জীবনকাল।
refresh_token একটি টোকেন যা আপনি একটি নতুন অ্যাক্সেস টোকেন পেতে ব্যবহার করতে পারেন। ব্যবহারকারী অ্যাক্সেস প্রত্যাহার না করা পর্যন্ত রিফ্রেশ টোকেন বৈধ। আবার, এই ক্ষেত্রটি শুধুমাত্র এই প্রতিক্রিয়াতে উপস্থিত থাকে যদি আপনি Google-এর অনুমোদন সার্ভারে প্রাথমিক অনুরোধে access_type প্যারামিটার offline সেট করেন।
scope access_token দ্বারা প্রদত্ত অ্যাক্সেসের সুযোগগুলি স্থান-সীমাবদ্ধ, কেস-সংবেদনশীল স্ট্রিংগুলির একটি তালিকা হিসাবে প্রকাশ করা হয়েছে।
token_type টোকেনের ধরন ফিরে এসেছে। এই সময়ে, এই ক্ষেত্রের মান সর্বদা Bearer এ সেট করা থাকে।

নিম্নলিখিত স্নিপেট একটি নমুনা প্রতিক্রিয়া দেখায়:

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

ত্রুটি

একটি অ্যাক্সেস টোকেনের জন্য অনুমোদন কোড বিনিময় করার সময় আপনি প্রত্যাশিত প্রতিক্রিয়ার পরিবর্তে নিম্নলিখিত ত্রুটির সম্মুখীন হতে পারেন৷ সাধারণ ত্রুটি কোড এবং প্রস্তাবিত রেজোলিউশন নীচে তালিকাভুক্ত করা হয়.

invalid_grant

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

Google API কল করা হচ্ছে

পিএইচপি

নিম্নলিখিত ধাপগুলি সম্পূর্ণ করে Google API কল করতে অ্যাক্সেস টোকেন ব্যবহার করুন:

  1. আপনি যদি একটি নতুন Google\Client অবজেক্টে একটি অ্যাক্সেস টোকেন প্রয়োগ করতে চান - উদাহরণস্বরূপ, যদি আপনি একটি ব্যবহারকারীর সেশনে অ্যাক্সেস টোকেন সংরক্ষণ করেন - setAccessToken পদ্ধতি ব্যবহার করুন:
    $client->setAccessToken($access_token);
  2. আপনি যে APIটি কল করতে চান তার জন্য একটি পরিষেবা বস্তু তৈরি করুন। আপনি যে API কল করতে চান তার জন্য কনস্ট্রাক্টরকে একটি অনুমোদিত Google\Client অবজেক্ট প্রদান করে আপনি একটি পরিষেবা বস্তু তৈরি করেন। উদাহরণস্বরূপ, YouTube ডেটা API কল করতে:
    $youtube = new Google_Service_YouTube($client);
  3. সার্ভিস অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, অনুমোদিত ব্যবহারকারীর YouTube চ্যানেল সম্পর্কে ডেটা পুনরুদ্ধার করতে:
    $channel = $youtube->channels->listChannels('snippet', array('mine' => $mine));

পাইথন

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

  1. আপনি যে APIটি কল করতে চান তার জন্য একটি পরিষেবা বস্তু তৈরি করুন। আপনি API এর নাম এবং সংস্করণ এবং ব্যবহারকারীর শংসাপত্র সহ googleapiclient.discovery লাইব্রেরির build পদ্ধতিতে কল করে একটি পরিষেবা অবজেক্ট তৈরি করেন: উদাহরণস্বরূপ, YouTube ডেটা API-এর সংস্করণ 3 কল করতে:
    from googleapiclient.discovery import build
    
    youtube = build('youtube', 'v3', credentials=credentials)
  2. সার্ভিস অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, অনুমোদিত ব্যবহারকারীর YouTube চ্যানেল সম্পর্কে ডেটা পুনরুদ্ধার করতে:
    channel = youtube.channels().list(mine=True, part='snippet').execute()

রুবি

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

  1. আপনি যে APIটি কল করতে চান তার জন্য একটি পরিষেবা বস্তু তৈরি করুন। উদাহরণস্বরূপ, YouTube ডেটা API-এর সংস্করণ 3 কল করতে:
    youtube = Google::Apis::YoutubeV3::YouTubeService.new
  2. পরিষেবাটিতে শংসাপত্রগুলি সেট করুন:
    youtube.authorization = credentials
  3. সার্ভিস অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, অনুমোদিত ব্যবহারকারীর YouTube চ্যানেল সম্পর্কে ডেটা পুনরুদ্ধার করতে:
    channel = youtube.list_channels(part, :mine => mine)

বিকল্পভাবে, একটি পদ্ধতিতে options পরামিতি সরবরাহ করে প্রতি-পদ্ধতির ভিত্তিতে অনুমোদন প্রদান করা যেতে পারে:

channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client })

Node.js

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

const { google } = require('googleapis');

// Example of using Google Drive API to list filenames in user's Drive.
const drive = google.drive('v3');
drive.files.list({
  auth: oauth2Client,
  pageSize: 10,
  fields: 'nextPageToken, files(id, name)',
}, (err1, res1) => {
  if (err1) return console.log('The API returned an error: ' + err1);
  const files = res1.data.files;
  if (files.length) {
    console.log('Files:');
    files.map((file) => {
      console.log(`${file.name} (${file.id})`);
    });
  } else {
    console.log('No files found.');
  }
});

HTTP/REST

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

মনে রাখবেন যে YouTube ডেটা API শুধুমাত্র সেই YouTube বিষয়বস্তুর মালিকদের জন্য পরিষেবা অ্যাকাউন্ট সমর্থন করে যারা একাধিক YouTube চ্যানেলের মালিক এবং পরিচালনা করে, যেমন রেকর্ড লেবেল এবং মুভি স্টুডিও৷

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

HTTP GET উদাহরণ

অনুমোদন ব্যবহার করে youtube.channels এন্ডপয়েন্টে (YouTube ডেটা API) একটি কল Authorization: Bearer HTTP শিরোনামটি নিচের মত দেখতে হতে পারে। মনে রাখবেন যে আপনাকে আপনার নিজস্ব অ্যাক্সেস টোকেন নির্দিষ্ট করতে হবে:

GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

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

GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

curl উদাহরণ

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

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true

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

curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

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

নিম্নলিখিত উদাহরণটি একটি JSON-ফরম্যাটেড অবজেক্ট প্রিন্ট করে যা ব্যবহারকারীর ইউটিউব চ্যানেল সম্পর্কে তথ্য প্রদর্শন করে ব্যবহারকারীর ইউটিউব অ্যাকাউন্ট পরিচালনা করার জন্য অ্যাপ্লিকেশনটিকে প্রমাণীকরণ এবং অনুমোদন করার পরে।

পিএইচপি

এই উদাহরণ চালানোর জন্য:

  1. মধ্যে API Console, পুনঃনির্দেশ URL-এর তালিকায় স্থানীয় মেশিনের URL যোগ করুন। উদাহরণস্বরূপ, http://localhost:8080 যোগ করুন।
  2. একটি নতুন ডিরেক্টরি তৈরি করুন এবং এটিতে পরিবর্তন করুন। যেমন:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. কম্পোজার ব্যবহার করে পিএইচপি-র জন্য Google API ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:
    composer require google/apiclient:^2.10
  4. নীচের বিষয়বস্তু সহ index.php এবং oauth2callback.php ফাইলগুলি তৈরি করুন৷
  5. পিএইচপি পরিবেশন করার জন্য কনফিগার করা একটি ওয়েব সার্ভারের সাথে উদাহরণটি চালান। আপনি যদি PHP 5.6 বা নতুন ব্যবহার করেন, তাহলে আপনি PHP এর বিল্ট-ইন টেস্ট ওয়েব সার্ভার ব্যবহার করতে পারেন:
    php -S localhost:8080 ~/php-oauth2-example

index.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfig('client_secrets.json');
$client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  $youtube = new Google_Service_YouTube($client);
  $channel = $youtube->channels->listChannels('snippet', array('mine' => $mine));
  echo json_encode($channel);
} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

oauth2callback.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfigFile('client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL);

if (! isset($_GET['code'])) {
  // Generate and set state value
  $state = bin2hex(random_bytes(16));
  $client->setState($state);
  $_SESSION['state'] = $state;

  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  // Check the state value
  if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) {
    die('State mismatch. Possible CSRF attack.');
  }
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

পাইথন

এই উদাহরণটি ফ্লাস্ক ফ্রেমওয়ার্ক ব্যবহার করে। এটি http://localhost:8080 এ একটি ওয়েব অ্যাপ্লিকেশন চালায় যা আপনাকে OAuth 2.0 ফ্লো পরীক্ষা করতে দেয়। আপনি যদি সেই URL এ যান, তাহলে আপনাকে চারটি লিঙ্ক দেখতে হবে:

  • একটি API অনুরোধ পরীক্ষা করুন: এই লিঙ্কটি এমন একটি পৃষ্ঠার দিকে নির্দেশ করে যা একটি নমুনা API অনুরোধ চালানোর চেষ্টা করে। প্রয়োজন হলে, এটি অনুমোদনের প্রবাহ শুরু করে। সফল হলে, পৃষ্ঠাটি API প্রতিক্রিয়া প্রদর্শন করে।
  • সরাসরি প্রমাণীকরণ প্রবাহ পরীক্ষা করুন: এই লিঙ্কটি এমন একটি পৃষ্ঠার দিকে নির্দেশ করে যা ব্যবহারকারীকে অনুমোদনের প্রবাহের মাধ্যমে পাঠাতে চেষ্টা করে। অ্যাপটি ব্যবহারকারীর পক্ষ থেকে অনুমোদিত API অনুরোধ জমা দেওয়ার অনুমতির অনুরোধ করে।
  • বর্তমান শংসাপত্রগুলি প্রত্যাহার করুন: এই লিঙ্কটি এমন একটি পৃষ্ঠার দিকে নির্দেশ করে যা ব্যবহারকারী ইতিমধ্যে অ্যাপ্লিকেশনটিকে দেওয়া অনুমতিগুলি প্রত্যাহার করে
  • ফ্লাস্ক সেশনের শংসাপত্রগুলি পরিষ্কার করুন: এই লিঙ্কটি ফ্লাস্ক সেশনে সংরক্ষিত অনুমোদনের শংসাপত্রগুলি সাফ করে। এটি আপনাকে দেখতে দেয় যে আপনার অ্যাপটিকে ইতিমধ্যেই অনুমতি দেওয়া ব্যবহারকারী একটি নতুন সেশনে একটি API অনুরোধ চালানোর চেষ্টা করলে কী ঘটবে৷ এটি আপনাকে এপিআই প্রতিক্রিয়া দেখতে দেয় যে আপনার অ্যাপটি যদি কোনও ব্যবহারকারী আপনার অ্যাপে দেওয়া অনুমতি প্রত্যাহার করে থাকে এবং আপনার অ্যাপটি প্রত্যাহার করা অ্যাক্সেস টোকেন সহ একটি অনুরোধ অনুমোদন করার চেষ্টা করে।
# -*- coding: utf-8 -*-

import os
import flask
import requests

import google.oauth2.credentials
import google_auth_oauthlib.flow
import googleapiclient.discovery

# This variable specifies the name of a file that contains the OAuth 2.0
# information for this application, including its client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'

app = flask.Flask(__name__)
# Note: A secret key is included in the sample so that it works.
# If you use this code in your application, replace this with a truly secret
# key. See https://flask.palletsprojects.com/quickstart/#sessions.
app.secret_key = 'REPLACE ME - this value is here as a placeholder.'


@app.route('/')
def index():
  return print_index_table()


@app.route('/test')
def test_api_request():
  if 'credentials' not in flask.session:
    return flask.redirect('authorize')

  # Load credentials from the session.
  credentials = google.oauth2.credentials.Credentials(
      **flask.session['credentials'])

  youtube = googleapiclient.discovery.build(
      API_SERVICE_NAME, API_VERSION, credentials=credentials)

  channel = youtube.channels().list(mine=True, part='snippet').execute()

  # Save credentials back to session in case access token was refreshed.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.jsonify(**channel)


@app.route('/authorize')
def authorize():
  # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps.
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES)

  # The URI created here must exactly match one of the authorized redirect URIs
  # for the OAuth 2.0 client, which you configured in the API Console. If this
  # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch'
  # error.
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  authorization_url, state = flow.authorization_url(
      # Enable offline access so that you can refresh an access token without
      # re-prompting the user for permission. Recommended for web server apps.
      access_type='offline',
      # Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes='true')

  # Store the state so the callback can verify the auth server response.
  flask.session['state'] = state

  return flask.redirect(authorization_url)


@app.route('/oauth2callback')
def oauth2callback():
  # Specify the state when creating the flow in the callback so that it can
  # verified in the authorization server response.
  state = flask.session['state']

  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  # Use the authorization server's response to fetch the OAuth 2.0 tokens.
  authorization_response = flask.request.url
  flow.fetch_token(authorization_response=authorization_response)

  # Store credentials in the session.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  credentials = flow.credentials
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.redirect(flask.url_for('test_api_request'))


@app.route('/revoke')
def revoke():
  if 'credentials' not in flask.session:
    return ('You need to <a href="/authorize">authorize</a> before ' +
            'testing the code to revoke credentials.')

  credentials = google.oauth2.credentials.Credentials(
    **flask.session['credentials'])

  revoke = requests.post('https://oauth2.googleapis.com/revoke',
      params={'token': credentials.token},
      headers = {'content-type': 'application/x-www-form-urlencoded'})

  status_code = getattr(revoke, 'status_code')
  if status_code == 200:
    return('Credentials successfully revoked.' + print_index_table())
  else:
    return('An error occurred.' + print_index_table())


@app.route('/clear')
def clear_credentials():
  if 'credentials' in flask.session:
    del flask.session['credentials']
  return ('Credentials have been cleared.<br><br>' +
          print_index_table())


def credentials_to_dict(credentials):
  return {'token': credentials.token,
          'refresh_token': credentials.refresh_token,
          'token_uri': credentials.token_uri,
          'client_id': credentials.client_id,
          'client_secret': credentials.client_secret,
          'scopes': credentials.scopes}

def print_index_table():
  return ('<table>' +
          '<tr><td><a href="/test">Test an API request</a></td>' +
          '<td>Submit an API request and see a formatted JSON response. ' +
          '    Go through the authorization flow if there are no stored ' +
          '    credentials for the user.</td></tr>' +
          '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' +
          '<td>Go directly to the authorization flow. If there are stored ' +
          '    credentials, you still might not be prompted to reauthorize ' +
          '    the application.</td></tr>' +
          '<tr><td><a href="/revoke">Revoke current credentials</a></td>' +
          '<td>Revoke the access token associated with the current user ' +
          '    session. After revoking credentials, if you go to the test ' +
          '    page, you should see an <code>invalid_grant</code> error.' +
          '</td></tr>' +
          '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' +
          '<td>Clear the access token currently stored in the user session. ' +
          '    After clearing the token, if you <a href="/test">test the ' +
          '    API request</a> again, you should go back to the auth flow.' +
          '</td></tr></table>')


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification.
  # ACTION ITEM for developers:
  #     When running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

  # Specify a hostname and port that are set as a valid redirect URI
  # for your API project in the Google API Console.
  app.run('localhost', 8080, debug=True)

রুবি

এই উদাহরণটি সিনাট্রা ফ্রেমওয়ার্ক ব্যবহার করে।

require 'google/apis/youtube_v3'
require 'sinatra'
require 'googleauth'
require 'googleauth/stores/redis_token_store'

configure do
  enable :sessions

  set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json')
  set :scope, Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY
  set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
  set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, '/oauth2callback')
end

get '/' do
  user_id = settings.client_id.id
  credentials = settings.authorizer.get_credentials(user_id, request)
  if credentials.nil?
    redirect settings.authorizer.get_authorization_url(login_hint: user_id, request: request)
  end
  youtube = Google::Apis::YoutubeV3::YouTubeService.new
  channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client })
  
  "<pre>#{JSON.pretty_generate(channel.to_h)}</pre>"
end

get '/oauth2callback' do
  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url
end

Node.js

এই উদাহরণ চালানোর জন্য:

  1. মধ্যে API Console, পুনঃনির্দেশ URL-এর তালিকায় স্থানীয় মেশিনের URL যোগ করুন। উদাহরণস্বরূপ, http://localhost যোগ করুন।
  2. নিশ্চিত করুন যে আপনার রক্ষণাবেক্ষণ LTS, সক্রিয় LTS, অথবা Node.js এর বর্তমান রিলিজ ইনস্টল করা আছে।
  3. একটি নতুন ডিরেক্টরি তৈরি করুন এবং এটিতে পরিবর্তন করুন। যেমন:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
  5. নিচের বিষয়বস্তু দিয়ে main.js ফাইল তৈরি করুন।
  6. উদাহরণ চালান:
    node .\main.js

main.js

const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI.
 * To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];
/* Global variable that stores user credential in this code example.
 * ACTION ITEM for developers:
 *   Store user's refresh token in your data store if
 *   incorporating this code into your real app.
 *   For more information on handling refresh tokens,
 *   see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens
 */
let userCredential = null;

async function main() {
  const app = express();

  app.use(session({
    secret: 'your_secure_secret_key', // Replace with a strong secret
    resave: false,
    saveUninitialized: false,
  }));

  // Example on redirecting user to Google's OAuth 2.0 server.
  app.get('/', async (req, res) => {
    // Generate a secure random state value.
    const state = crypto.randomBytes(32).toString('hex');
    // Store state in the session
    req.session.state = state;

    // Generate a url that asks permissions for the Drive activity scope
    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true,
      // Include the state parameter to reduce the risk of CSRF attacks.
      state: state
    });

    res.redirect(authorizationUrl);
  });

  // Receive the callback from Google's OAuth 2.0 server.
  app.get('/oauth2callback', async (req, res) => {
    // Handle the OAuth 2.0 server response
    let q = url.parse(req.url, true).query;

    if (q.error) { // An error response e.g. error=access_denied
      console.log('Error:' + q.error);
    } else if (q.state !== req.session.state) { //check state value
      console.log('State mismatch. Possible CSRF attack');
      res.end('State mismatch. Possible CSRF attack');
    } else { // Get access and refresh tokens (if access_type is offline)
      let { tokens } = await oauth2Client.getToken(q.code);
      oauth2Client.setCredentials(tokens);

      /** Save credential to the global variable in case access token was refreshed.
        * ACTION ITEM: In a production app, you likely want to save the refresh token
        *              in a secure persistent database instead. */
      userCredential = tokens;

      // Example of using Google Drive API to list filenames in user's Drive.
      const drive = google.drive('v3');
      drive.files.list({
        auth: oauth2Client,
        pageSize: 10,
        fields: 'nextPageToken, files(id, name)',
      }, (err1, res1) => {
        if (err1) return console.log('The API returned an error: ' + err1);
        const files = res1.data.files;
        if (files.length) {
          console.log('Files:');
          files.map((file) => {
            console.log(`${file.name} (${file.id})`);
          });
        } else {
          console.log('No files found.');
        }
      });
    }
  });

  // Example on revoking a token
  app.get('/revoke', async (req, res) => {
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;

    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });

    postReq.on('error', error => {
      console.log(error)
    });

    // Post the request with data
    postReq.write(postData);
    postReq.end();
  });


  const server = http.createServer(app);
  server.listen(80);
}
main().catch(console.error);

HTTP/REST

এই পাইথন উদাহরণটি OAuth 2.0 ওয়েব প্রবাহ প্রদর্শন করতে ফ্লাস্ক ফ্রেমওয়ার্ক এবং অনুরোধ লাইব্রেরি ব্যবহার করে। আমরা এই প্রবাহের জন্য পাইথনের জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করার পরামর্শ দিই। (পাইথন ট্যাবের উদাহরণটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।)

import json

import flask
import requests


app = flask.Flask(__name__)

CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123'  # Read from a file or environmental variable in a real app
SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl'
REDIRECT_URI = 'http://example.com/oauth2callback'


@app.route('/')
def index():
  if 'credentials' not in flask.session:
    return flask.redirect(flask.url_for('oauth2callback'))
  credentials = json.loads(flask.session['credentials'])
  if credentials['expires_in'] <= 0:
    return flask.redirect(flask.url_for('oauth2callback'))
  else:
    headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
    req_uri = 'https://www.googleapis.com/youtube/v3/channels/list'
    r = requests.get(req_uri, headers=headers)
    return r.text


@app.route('/oauth2callback')
def oauth2callback():
  if 'code' not in flask.request.args:
    state = str(uuid.uuid4())
    flask.session['state'] = state
    auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
                '&client_id={}&redirect_uri={}&scope={}&state={}').format(CLIENT_ID, REDIRECT_URI,
                                                                          SCOPE, state)
    return flask.redirect(auth_uri)
  else:
    if 'state' not in flask.request.args or flask.request.args['state'] != flask.session['state']:
      return 'State mismatch. Possible CSRF attack.', 400

    auth_code = flask.request.args.get('code')
    data = {'code': auth_code,
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'redirect_uri': REDIRECT_URI,
            'grant_type': 'authorization_code'}
    r = requests.post('https://oauth2.googleapis.com/token', data=data)
    flask.session['credentials'] = r.text
    return flask.redirect(flask.url_for('index'))


if __name__ == '__main__':
  import uuid
  app.secret_key = str(uuid.uuid4())
  app.debug = False
  app.run()

ইউআরআই যাচাইকরণের নিয়ম পুনঃনির্দেশ করুন

ডেভেলপারদের তাদের অ্যাপ্লিকেশানগুলিকে সুরক্ষিত রাখতে সাহায্য করার জন্য Google URI পুনঃনির্দেশ করতে নিম্নলিখিত বৈধতা নিয়মগুলি প্রয়োগ করে৷ আপনার রিডাইরেক্ট ইউআরআইগুলিকে অবশ্যই এই নিয়মগুলি মেনে চলতে হবে৷ নীচে উল্লিখিত ডোমেন, হোস্ট, পাথ, কোয়েরি, স্কিম এবং ব্যবহারকারীর তথ্যের সংজ্ঞার জন্য RFC 3986 বিভাগ 3 দেখুন।

বৈধতা নিয়ম
স্কিম

রিডাইরেক্ট ইউআরআইগুলিকে অবশ্যই HTTPS স্কিম ব্যবহার করতে হবে, সাধারণ HTTP নয়। লোকালহোস্ট ইউআরআই (স্থানীয় হোস্ট আইপি ঠিকানা ইউআরআই সহ) এই নিয়ম থেকে অব্যাহতিপ্রাপ্ত।

হোস্ট

হোস্ট কাঁচা IP ঠিকানা হতে পারে না. স্থানীয় হোস্ট আইপি ঠিকানাগুলি এই নিয়ম থেকে অব্যাহতিপ্রাপ্ত।

ডোমেইন
  • হোস্ট টিএলডি ( টপ লেভেল ডোমেন ) অবশ্যই পাবলিক প্রত্যয় তালিকার অন্তর্গত।
  • হোস্ট ডোমেন “googleusercontent.com” হতে পারে না।
  • রিডাইরেক্ট ইউআরআইতে ইউআরএল শর্টনার ডোমেন থাকতে পারে না (যেমন goo.gl ) যদি না অ্যাপটি ডোমেনের মালিক হয়। উপরন্তু, যদি একটি শর্টনার ডোমেনের মালিক একটি অ্যাপ সেই ডোমেনে রিডাইরেক্ট করতে বেছে নেয়, তাহলে সেই রিডাইরেক্ট URI-এর পাথে অবশ্যই “/google-callback/” থাকতে হবে অথবা “/google-callback” দিয়ে শেষ হতে হবে।
  • ব্যবহারকারীর তথ্য

    রিডাইরেক্ট ইউআরআই-এ ইউজার ইনফো সাবকম্পোনেন্ট থাকতে পারে না।

    পথ

    রিডাইরেক্ট ইউআরআই-এ একটি পাথ ট্রাভার্সাল থাকতে পারে না (এটিকে ডাইরেক্টরি ব্যাকট্র্যাকিংও বলা হয়), যা একটি “/..” বা “\..” বা তাদের URL এনকোডিং দ্বারা প্রতিনিধিত্ব করা হয়৷

    প্রশ্ন

    রিডাইরেক্ট URI-এ খোলা রিডাইরেক্ট থাকতে পারে না।

    খণ্ড

    রিডাইরেক্ট URI তে ফ্র্যাগমেন্ট কম্পোনেন্ট থাকতে পারে না।

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

    ক্রমবর্ধমান অনুমোদন

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

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

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

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

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

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

    ধাপ 1-এ ভাষা-নির্দিষ্ট কোডের নমুনা: অনুমোদনের পরামিতি সেট করুন এবং ধাপ 2-এ HTTP/REST পুনঃনির্দেশ URL: Google-এর OAuth 2.0 সার্ভারে পুনঃনির্দেশ সমস্তই ক্রমবর্ধমান অনুমোদন ব্যবহার করে। নীচের কোড নমুনাগুলি সেই কোডটিও দেখায় যা আপনাকে ক্রমবর্ধমান অনুমোদন ব্যবহার করতে যোগ করতে হবে।

    পিএইচপি

    $client->setIncludeGrantedScopes(true);

    পাইথন

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

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    রুবি

    auth_client.update!(
      :additional_parameters => {"include_granted_scopes" => "true"}
    )

    Node.js

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    HTTP/REST

    এই উদাহরণে, কলিং অ্যাপ্লিকেশানটি ব্যবহারকারীর ইউটিউব অ্যানালিটিক্স ডেটা পুনরুদ্ধার করার জন্য অ্যাক্সেসের অনুরোধ করে অন্য যেকোন অ্যাক্সেসের সাথে যা ব্যবহারকারী ইতিমধ্যেই অ্যাপ্লিকেশনটিতে মঞ্জুর করেছেন৷

    GET https://accounts.google.com/o/oauth2/v2/auth?
      scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.readonly&
      access_type=offline&
      state=security_token%3D138rk%3Btarget_url%3Dhttp...index&
      redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
      response_type=code&
      client_id=client_id&
      include_granted_scopes=true
    
          

    Refreshing an access token (offline access)

    Access tokens periodically expire and become invalid credentials for a related API request. You can refresh an access token without prompting the user for permission (including when the user is not present) if you requested offline access to the scopes associated with the token.

    • If you use a Google API Client Library, the client object refreshes the access token as needed as long as you configure that object for offline access.
    • If you are not using a client library, you need to set the access_type HTTP query parameter to offline when redirecting the user to Google's OAuth 2.0 server. In that case, Google's authorization server returns a refresh token when you exchange an authorization code for an access token. Then, if the access token expires (or at any other time), you can use a refresh token to obtain a new access token.

    Requesting offline access is a requirement for any application that needs to access a Google API when the user is not present. For example, an app that performs backup services or executes actions at predetermined times needs to be able to refresh its access token when the user is not present. The default style of access is called online.

    Server-side web applications, installed applications, and devices all obtain refresh tokens during the authorization process. Refresh tokens are not typically used in client-side (JavaScript) web applications.

    PHP

    If your application needs offline access to a Google API, set the API client's access type to offline:

    $client->setAccessType("offline");

    একজন ব্যবহারকারী অনুরোধকৃত স্কোপগুলিতে অফলাইন অ্যাক্সেস মঞ্জুর করার পরে, ব্যবহারকারী অফলাইনে থাকাকালীন আপনি ব্যবহারকারীর পক্ষে Google API অ্যাক্সেস করতে API ক্লায়েন্ট ব্যবহার করা চালিয়ে যেতে পারেন। ক্লায়েন্ট অবজেক্ট প্রয়োজন অনুযায়ী অ্যাক্সেস টোকেন রিফ্রেশ করবে।

    পাইথন

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

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    একজন ব্যবহারকারী অনুরোধকৃত স্কোপগুলিতে অফলাইন অ্যাক্সেস মঞ্জুর করার পরে, ব্যবহারকারী অফলাইনে থাকাকালীন আপনি ব্যবহারকারীর পক্ষে Google API অ্যাক্সেস করতে API ক্লায়েন্ট ব্যবহার করা চালিয়ে যেতে পারেন। ক্লায়েন্ট অবজেক্ট প্রয়োজন অনুযায়ী অ্যাক্সেস টোকেন রিফ্রেশ করবে।

    রুবি

    যদি আপনার অ্যাপ্লিকেশনের একটি Google API-এ অফলাইন অ্যাক্সেসের প্রয়োজন হয়, তাহলে API ক্লায়েন্টের অ্যাক্সেসের ধরন offline সেট করুন:

    auth_client.update!(
      :additional_parameters => {"access_type" => "offline"}
    )

    একজন ব্যবহারকারী অনুরোধকৃত স্কোপগুলিতে অফলাইন অ্যাক্সেস মঞ্জুর করার পরে, ব্যবহারকারী অফলাইনে থাকাকালীন আপনি ব্যবহারকারীর পক্ষে Google API অ্যাক্সেস করতে API ক্লায়েন্ট ব্যবহার করা চালিয়ে যেতে পারেন। ক্লায়েন্ট অবজেক্ট প্রয়োজন অনুযায়ী অ্যাক্সেস টোকেন রিফ্রেশ করবে।

    Node.js

    যদি আপনার অ্যাপ্লিকেশনের একটি Google API-এ অফলাইন অ্যাক্সেসের প্রয়োজন হয়, তাহলে API ক্লায়েন্টের অ্যাক্সেসের ধরন offline সেট করুন:

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    একজন ব্যবহারকারী অনুরোধকৃত স্কোপগুলিতে অফলাইন অ্যাক্সেস মঞ্জুর করার পরে, ব্যবহারকারী অফলাইনে থাকাকালীন আপনি ব্যবহারকারীর পক্ষে Google API অ্যাক্সেস করতে API ক্লায়েন্ট ব্যবহার করা চালিয়ে যেতে পারেন। ক্লায়েন্ট অবজেক্ট প্রয়োজন অনুযায়ী অ্যাক্সেস টোকেন রিফ্রেশ করবে।

    অ্যাক্সেস টোকেন মেয়াদ শেষ. মেয়াদ শেষ হয়ে গেলে এই লাইব্রেরিটি স্বয়ংক্রিয়ভাবে একটি নতুন অ্যাক্সেস টোকেন পেতে রিফ্রেশ টোকেন ব্যবহার করবে। আপনি সর্বদা সাম্প্রতিক টোকেনগুলি সংরক্ষণ করছেন তা নিশ্চিত করার একটি সহজ উপায় হল টোকেন ইভেন্ট ব্যবহার করা:

    oauth2Client.on('tokens', (tokens) => {
      if (tokens.refresh_token) {
        // store the refresh_token in your secure persistent database
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
    });

    এই টোকেন ইভেন্টটি শুধুমাত্র প্রথম অনুমোদনে ঘটে এবং রিফ্রেশ টোকেন পাওয়ার জন্য generateAuthUrl পদ্ধতিতে কল করার সময় আপনাকে আপনার access_type offline সেট করতে হবে। আপনি যদি ইতিমধ্যেই আপনার অ্যাপটিকে একটি রিফ্রেশ টোকেন পাওয়ার জন্য উপযুক্ত সীমাবদ্ধতা সেট না করে প্রয়োজনীয় অনুমতি দিয়ে থাকেন, তাহলে আপনাকে একটি নতুন রিফ্রেশ টোকেন পাওয়ার জন্য অ্যাপ্লিকেশনটিকে পুনরায় অনুমোদন করতে হবে।

    পরবর্তী সময়ে refresh_token সেট করতে, আপনি setCredentials পদ্ধতি ব্যবহার করতে পারেন:

    oauth2Client.setCredentials({
      refresh_token: `STORED_REFRESH_TOKEN`
    });
    

    ক্লায়েন্টের একটি রিফ্রেশ টোকেন হয়ে গেলে, API-তে পরবর্তী কলে অ্যাক্সেস টোকেনগুলি অর্জিত হবে এবং স্বয়ংক্রিয়ভাবে রিফ্রেশ হবে।

    HTTP/REST

    একটি অ্যাক্সেস টোকেন রিফ্রেশ করতে, আপনার অ্যাপ্লিকেশনটি Google এর অনুমোদন সার্ভারে একটি HTTPS POST অনুরোধ পাঠায় ( https://oauth2.googleapis.com/token ) যাতে নিম্নলিখিত প্যারামিটারগুলি অন্তর্ভুক্ত থাকে:

    ক্ষেত্র
    client_id ক্লায়েন্ট আইডি থেকে প্রাপ্ত API Console.
    client_secret ক্লায়েন্ট সিক্রেট থেকে প্রাপ্ত API Console.
    grant_type OAuth 2.0 স্পেসিফিকেশনে যেমন সংজ্ঞায়িত করা হয়েছে , এই ক্ষেত্রের মান অবশ্যই refresh_token এ সেট করতে হবে।
    refresh_token রিফ্রেশ টোকেন অনুমোদন কোড বিনিময় থেকে ফিরে.

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

    POST /token HTTP/1.1
    Host: oauth2.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=your_client_id&
    client_secret=your_client_secret&
    refresh_token=refresh_token&
    grant_type=refresh_token

    যতক্ষণ না ব্যবহারকারী অ্যাপ্লিকেশনটিতে দেওয়া অ্যাক্সেস প্রত্যাহার না করে, টোকেন সার্ভার একটি JSON অবজেক্ট ফেরত দেয় যাতে একটি নতুন অ্যাক্সেস টোকেন রয়েছে। নিম্নলিখিত স্নিপেট একটি নমুনা প্রতিক্রিয়া দেখায়:

    {
      "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
      "expires_in": 3920,
      "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
      "token_type": "Bearer"
    }

    নোট করুন যে রিফ্রেশ টোকেনের সংখ্যার উপর সীমা আছে যা জারি করা হবে; প্রতি ক্লায়েন্ট/ব্যবহারকারী সংমিশ্রণে একটি সীমা এবং সমস্ত ক্লায়েন্ট জুড়ে ব্যবহারকারী প্রতি আরেকটি। আপনার দীর্ঘমেয়াদী সঞ্চয়স্থানে রিফ্রেশ টোকেন সংরক্ষণ করা উচিত এবং যতক্ষণ তারা বৈধ থাকবে ততক্ষণ সেগুলি ব্যবহার করা চালিয়ে যেতে হবে। আপনার অ্যাপ্লিকেশন যদি অনেকগুলি রিফ্রেশ টোকেনের অনুরোধ করে, তবে এটি এই সীমার মধ্যে চলে যেতে পারে, এই ক্ষেত্রে পুরানো রিফ্রেশ টোকেনগুলি কাজ করা বন্ধ করে দেবে৷

    একটি টোকেন প্রত্যাহার করা হচ্ছে

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

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

    পিএইচপি

    প্রোগ্রাম্যাটিকভাবে একটি টোকেন প্রত্যাহার করতে, কল করুন revokeToken() :

    $client->revokeToken();

    পাইথন

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

    requests.post('https://oauth2.googleapis.com/revoke',
        params={'token': credentials.token},
        headers = {'content-type': 'application/x-www-form-urlencoded'})

    রুবি

    প্রোগ্রাম্যাটিকভাবে একটি টোকেন প্রত্যাহার করতে, oauth2.revoke endpoint এ একটি HTTP অনুরোধ করুন:

    uri = URI('https://oauth2.googleapis.com/revoke')
    response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
    

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

    যদি প্রত্যাহার সফলভাবে প্রক্রিয়া করা হয়, তাহলে প্রতিক্রিয়ার স্ট্যাটাস কোড হল 200 । ত্রুটি অবস্থার জন্য, একটি স্থিতি কোড 400 একটি ত্রুটি কোড সহ ফেরত দেওয়া হয়।

    Node.js

    প্রোগ্রাম্যাটিকভাবে একটি টোকেন প্রত্যাহার করতে, একটি HTTPS POST অনুরোধ করুন /revoke :

    const https = require('https');
    
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;
    
    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    
    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });
    
    postReq.on('error', error => {
      console.log(error)
    });
    
    // Post the request with data
    postReq.write(postData);
    postReq.end();
    

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

    যদি প্রত্যাহার সফলভাবে প্রক্রিয়া করা হয়, তাহলে প্রতিক্রিয়ার স্ট্যাটাস কোড হল 200 । ত্রুটি অবস্থার জন্য, একটি স্থিতি কোড 400 একটি ত্রুটি কোড সহ ফেরত দেওয়া হয়।

    HTTP/REST

    প্রোগ্রাম্যাটিকভাবে একটি টোকেন প্রত্যাহার করতে, আপনার অ্যাপ্লিকেশনটি 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 । ত্রুটি অবস্থার জন্য, একটি এইচটিটিপি স্ট্যাটাস কোড 400 একটি ত্রুটি কোড সহ ফেরত দেওয়া হয়।

    ক্রস-অ্যাকাউন্ট সুরক্ষা বাস্তবায়ন করা

    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

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