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

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

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

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

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

  • YouTube Analytics API পরিষেবা অ্যাকাউন্ট প্রবাহ সমর্থন করে না।
  • YouTube রিপোর্টিং API শুধুমাত্র সেই YouTube কন্টেন্ট মালিকদের জন্য পরিষেবা অ্যাকাউন্ট প্রবাহ সমর্থন করে যারা একাধিক YouTube চ্যানেলের মালিক এবং পরিচালনা করেন। বিশেষ করে, কন্টেন্ট মালিকরা API অনুরোধগুলিতে পরিষেবা অ্যাকাউন্ট ব্যবহার করতে পারেন যা onBehalfOfContentOwner অনুরোধ প্যারামিটারের জন্য একটি মান সেট করে।

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

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

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

সার্ভার-সাইড অ্যাপ্লিকেশনের জন্য 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 Analytics API এবং YouTube Reporting API খুঁজে বের করতে এবং সক্ষম করতে লাইব্রেরি পৃষ্ঠাটি ব্যবহার করুন। YouTube Analytics ডেটা পুনরুদ্ধার করে এমন অনেক অ্যাপ্লিকেশন YouTube Data API-এর সাথেও ইন্টারফেস করে। আপনার অ্যাপ্লিকেশন ব্যবহার করবে এমন অন্য কোনও API খুঁজুন এবং সেগুলিও সক্ষম করুন।

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

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

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

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

    আমরা সুপারিশ করছি যে আপনি আপনার অ্যাপের অনুমোদনের শেষ বিন্দুগুলি এমনভাবে ডিজাইন করুন যাতে আপনার অ্যাপ্লিকেশনটি পৃষ্ঠার অন্যান্য সংস্থানগুলিতে অনুমোদনের কোডগুলি প্রকাশ না করে।

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

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

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

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

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

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

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ youtube আপনার YouTube অ্যাকাউন্ট পরিচালনা করুন
https://www. googleapis. com/ auth/ youtube. readonly আপনার YouTube অ্যাকাউন্ট দেখুন
https://www. googleapis. com/ auth/ youtubepartner YouTube-এ আপনার সম্পদ এবং সংশ্লিষ্ট বিষয়বস্তু দেখুন ও পরিচালনা করুন
https://www. googleapis. com/ auth/ yt-analytics-monetary. readonly আপনার YouTube সামগ্রীর জন্য আর্থিক এবং অ-আর্থিক YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷
https://www. googleapis. com/ auth/ yt-analytics. readonly আপনার YouTube সামগ্রীর জন্য YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷

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

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ yt-analytics-monetary. readonly আপনার YouTube সামগ্রীর জন্য আর্থিক এবং অ-আর্থিক YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷
https://www. googleapis. com/ auth/ yt-analytics. readonly আপনার YouTube সামগ্রীর জন্য YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷

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

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

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

পিএইচপি

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

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

    composer require google/apiclient:^2.15.0

আরও তথ্যের জন্য PHP-এর জন্য 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

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

রুবি

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

  • রুবি ২.৬ বা তার বেশি
  • রুবির জন্য গুগল অথ লাইব্রেরি:

    gem install googleauth
  • ড্রাইভ এবং ক্যালেন্ডার গুগল এপিআই-এর জন্য ক্লায়েন্ট লাইব্রেরি:

    gem install google-apis-drive_v3 google-apis-calendar_v3
  • সিনাত্রা রুবি ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক।

    gem install sinatra

নোড.জেএস

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

  • রক্ষণাবেক্ষণ LTS, সক্রিয় LTS, অথবা Node.js এর বর্তমান রিলিজ।
  • গুগল এপিআই নোড.জেএস ক্লায়েন্ট:

    npm install googleapis crypto express express-session

HTTP/বিশ্রাম

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

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

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

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

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

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

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

  • যদি আপনি 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 Analytics রিপোর্ট পুনরুদ্ধার করার জন্য অফলাইন অ্যাক্সেসের অনুরোধ করতে:

use Google\Client;

$client = new 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_YouTubeAnalytics::YT_ANALYTICS_READONLY);

// 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 ফাইল থেকে তথ্য ব্যবহার করে আপনার অ্যাপ্লিকেশন সনাক্ত করে যা আপনি অনুমোদন শংসাপত্র তৈরি করার পরে ডাউনলোড করেছেন। এই অবজেক্টটি আপনার অ্যাপ্লিকেশন যে স্কোপগুলিতে অ্যাক্সেসের অনুমতি চাইছে এবং আপনার অ্যাপ্লিকেশনের auth এন্ডপয়েন্টের URL সনাক্ত করে, যা Google এর OAuth 2.0 সার্ভার থেকে প্রতিক্রিয়া পরিচালনা করবে। অবশেষে, কোডটি ঐচ্ছিক access_type এবং include_granted_scopes প্যারামিটার সেট করে।

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

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/yt-analytics.readonly',
            'https://www.googleapis.com/auth/calendar.readonly'])

# 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 ফাইলটি ব্যবহার করুন। যখন আপনি একটি ক্লায়েন্ট অবজেক্ট কনফিগার করেন, তখন আপনি আপনার অ্যাপ্লিকেশনের অ্যাক্সেস করার জন্য প্রয়োজনীয় স্কোপগুলি নির্দিষ্ট করেন, সাথে আপনার অ্যাপ্লিকেশনের auth এন্ডপয়েন্টের URLও উল্লেখ করেন, যা OAuth 2.0 সার্ভার থেকে প্রতিক্রিয়া পরিচালনা করবে।

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

require 'googleauth'
require 'googleauth/web_user_authorizer'
require 'googleauth/stores/redis_token_store'

require 'google/apis/youtube_analytics_v1'
require 'google/apis/calendar_v3'

# Required, call the from_file method to retrieve the client ID from a
# client_secret.json file.
client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json')

# Required, scope value 
# Access scopes for two non-Sign-In scopes: Read-only Drive activity and Google Calendar.
scope = ['Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY',
         'Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY']

# Required, Authorizers require a storage instance to manage long term persistence of
# access and refresh tokens.
token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)

# 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.
callback_uri = '/oauth2callback'

# 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.
authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope,
                                                token_store, callback_uri)

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

নোড.জেএস

নিম্নলিখিত কোড স্নিপেটটি একটি 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 two non-Sign-In scopes: Read-only Drive activity and Google Calendar.
const scopes = [
  'https://www.googleapis.com/auth/yt-analytics.readonly',
  'https://www.googleapis.com/auth/calendar.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 and Google Calendar 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/বিশ্রাম

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

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

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

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

redirect_uri প্রয়োজনীয়

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

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

response_type প্রয়োজনীয়

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

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

scope প্রয়োজনীয়

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

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

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

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ youtube আপনার YouTube অ্যাকাউন্ট পরিচালনা করুন
https://www. googleapis. com/ auth/ youtube. readonly আপনার YouTube অ্যাকাউন্ট দেখুন
https://www. googleapis. com/ auth/ youtubepartner YouTube-এ আপনার সম্পদ এবং সংশ্লিষ্ট বিষয়বস্তু দেখুন ও পরিচালনা করুন
https://www. googleapis. com/ auth/ yt-analytics-monetary. readonly আপনার YouTube সামগ্রীর জন্য আর্থিক এবং অ-আর্থিক YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷
https://www. googleapis. com/ auth/ yt-analytics. readonly আপনার YouTube সামগ্রীর জন্য YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷

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

ব্যাপ্তি বর্ণনা
https://www. googleapis. com/ auth/ yt-analytics-monetary. readonly আপনার YouTube সামগ্রীর জন্য আর্থিক এবং অ-আর্থিক YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷
https://www. googleapis. com/ auth/ yt-analytics. readonly আপনার YouTube সামগ্রীর জন্য YouTube বিশ্লেষণ প্রতিবেদনগুলি দেখুন৷

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

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

access_type প্রস্তাবিত

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

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

state প্রস্তাবিত

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

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

include_granted_scopes ঐচ্ছিক

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

login_hint ঐচ্ছিক

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

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

prompt ঐচ্ছিক

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

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

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

ধাপ ২: 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));

পাইথন

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

return flask.redirect(authorization_url)

রুবি

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

নোড.জেএস

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

HTTP/বিশ্রাম

Google এর অনুমোদন সার্ভারে নমুনা পুনর্নির্দেশনা

নিচের নমুনা URLটি এমন একটি স্কোপে অফলাইন অ্যাক্সেস ( access_type=offline ) অনুরোধ করে যা ব্যবহারকারীর YouTube Analytics রিপোর্ট পুনরুদ্ধার করার জন্য অ্যাক্সেসের অনুমতি দেয়। এটি ক্রমবর্ধমান অনুমোদন ব্যবহার করে নিশ্চিত করে যে নতুন অ্যাক্সেস টোকেন ব্যবহারকারী পূর্বে অ্যাপ্লিকেশন অ্যাক্সেস মঞ্জুর করেছেন এমন যেকোনো স্কোপকে কভার করে। URLটি প্রয়োজনীয় redirect_uri , response_type , এবং client_id প্যারামিটারের পাশাপাশি state প্যারামিটারের জন্য মানও সেট করে। URLটিতে পঠনযোগ্যতার জন্য লাইন ব্রেক এবং স্পেস রয়েছে।

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.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 ব্যবহার করে প্রতিক্রিয়াটি আপনার অ্যাপ্লিকেশনে ফেরত পাঠানো হয়।

ধাপ ৩: গুগল ব্যবহারকারীর কাছ থেকে সম্মতির অনুরোধ জানায়

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

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

ত্রুটি

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

admin_policy_enforced

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

disallowed_useragent

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

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

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

org_internal

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

invalid_client

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

deleted_client

অনুরোধটি করার জন্য ব্যবহৃত OAuth ক্লায়েন্টটি মুছে ফেলা হয়েছে। অব্যবহৃত ক্লায়েন্টের ক্ষেত্রে মুছে ফেলা ম্যানুয়ালি বা স্বয়ংক্রিয়ভাবে ঘটতে পারে। মুছে ফেলা ক্লায়েন্টগুলি মুছে ফেলার 30 দিনের মধ্যে পুনরুদ্ধার করা যেতে পারে। আরও জানুন

invalid_grant

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

redirect_uri_mismatch

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

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

invalid_request

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

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

ধাপ ৪: 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 ড্রাইভের ফাইলগুলির মেটাডেটা দেখার জন্য কেবল পঠনযোগ্য অ্যাক্সেস এবং আপনার Google ক্যালেন্ডার ইভেন্টগুলি দেখার জন্য কেবল পঠনযোগ্য অ্যাক্সেসের অনুরোধ করে:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.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 ত্রুটি প্রদান করবে যদি না আপনার স্থানীয় মেশিন সেই ঠিকানায় একটি ফাইল পরিবেশন করে। পরবর্তী ধাপে ব্যবহারকারীকে আপনার অ্যাপ্লিকেশনে পুনঃনির্দেশিত করা হলে URI-তে ফেরত পাঠানো তথ্য সম্পর্কে আরও বিশদ বিবরণ প্রদান করা হবে।

ধাপ ৫: রিফ্রেশ এবং অ্যাক্সেস টোকেনের জন্য অনুমোদন কোড বিনিময় করুন

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

পিএইচপি

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

$access_token = $client->fetchAccessTokenWithAuthCode($_GET['code']);

পাইথন

আপনার কলব্যাক পৃষ্ঠায়, অনুমোদন সার্ভারের প্রতিক্রিয়া যাচাই করতে 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/yt-analytics.readonly'],
    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 browser session storage, but for security: client_id, client_secret,
# and token_uri are instead stored only on the backend server.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'granted_scopes': credentials.granted_scopes}

রুবি

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

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

নোড.জেএস

একটি অ্যাক্সেস টোকেনের জন্য একটি অনুমোদন কোড বিনিময় করতে, 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/বিশ্রাম

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

ক্ষেত্র
client_id থেকে প্রাপ্ত ক্লায়েন্ট আইডি Cloud ConsoleClients page.
client_secret ঐচ্ছিক

ক্লায়েন্টের গোপন তথ্য যা থেকে প্রাপ্ত Cloud ConsoleClients page.

code প্রাথমিক অনুরোধ থেকে অনুমোদন কোডটি ফিরে এসেছে।
grant_type OAuth 2.0 স্পেসিফিকেশনে সংজ্ঞায়িত হিসাবে , এই ক্ষেত্রের মান authorization_code এ সেট করা আবশ্যক।
redirect_uri আপনার প্রকল্পের জন্য তালিকাভুক্ত পুনঃনির্দেশ URI গুলির মধ্যে একটি Cloud ConsoleClients 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&
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 সেট করেন।
refresh_token_expires_in রিফ্রেশ টোকেনের অবশিষ্ট জীবনকাল সেকেন্ডে। এই মানটি কেবল তখনই সেট করা হয় যখন ব্যবহারকারী সময়-ভিত্তিক অ্যাক্সেস মঞ্জুর করে।
scope access_token দ্বারা প্রদত্ত অ্যাক্সেসের সুযোগগুলি স্থান-বিভাজিত, কেস-সংবেদনশীল স্ট্রিংগুলির তালিকা হিসাবে প্রকাশ করা হয়।
token_type টোকেনের ধরণটি ফিরে এসেছে। এই সময়ে, এই ক্ষেত্রের মান সর্বদা Bearer এ সেট করা থাকে।

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

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

ত্রুটি

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

invalid_grant

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

ধাপ ৬: ব্যবহারকারীরা কোন স্কোপগুলি মঞ্জুর করেছেন তা পরীক্ষা করুন

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

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

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

পিএইচপি

ব্যবহারকারী কোন স্কোপগুলি মঞ্জুর করেছেন তা পরীক্ষা করতে, getGrantedScope() পদ্ধতিটি ব্যবহার করুন:

// Space-separated string of granted scopes if it exists, otherwise null.
$granted_scopes = $client->getOAuth2Service()->getGrantedScope();

// Determine which scopes user granted and build a dictionary
$granted_scopes_dict = [
  'Drive' => str_contains($granted_scopes, Google\Service\Drive::DRIVE_METADATA_READONLY),
  'Calendar' => str_contains($granted_scopes, Google\Service\Calendar::CALENDAR_READONLY)
];

পাইথন

ফিরে আসা credentials অবজেক্টটিতে একটি granted_scopes সম্পত্তি রয়েছে, যা ব্যবহারকারীর দ্বারা আপনার অ্যাপে প্রদত্ত স্কোপের একটি তালিকা।

credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'granted_scopes': credentials.granted_scopes}

নিম্নলিখিত ফাংশনটি পরীক্ষা করে যে ব্যবহারকারী আপনার অ্যাপে কোন স্কোপ দিয়েছেন।

def check_granted_scopes(credentials):
  features = {}
  if 'https://www.googleapis.com/auth/drive.metadata.readonly' in credentials['granted_scopes']:
    features['drive'] = True
  else:
    features['drive'] = False

  if 'https://www.googleapis.com/auth/calendar.readonly' in credentials['granted_scopes']:
    features['calendar'] = True
  else:
    features['calendar'] = False

  return features

রুবি

একসাথে একাধিক স্কোপ অনুরোধ করার সময়, credentials অবজেক্টের scope প্রপার্টির মাধ্যমে কোন স্কোপগুলি মঞ্জুর করা হয়েছে তা পরীক্ষা করুন।

# User authorized the request. Now, check which scopes were granted.
if credentials.scope.include?(Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY)
  # User authorized read-only Drive activity permission.
  # Calling the APIs, etc
else
  # User didn't authorize read-only Drive activity permission.
  # Update UX and application accordingly
end

# Check if user authorized Calendar read permission.
if credentials.scope.include?(Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY)
  # User authorized Calendar read permission.
  # Calling the APIs, etc.
else
  # User didn't authorize Calendar read permission.
  # Update UX and application accordingly
end

নোড.জেএস

একসাথে একাধিক স্কোপ অনুরোধ করার সময়, tokens অবজেক্টের scope প্রপার্টির মাধ্যমে কোন স্কোপগুলি মঞ্জুর করা হয়েছে তা পরীক্ষা করুন।

// User authorized the request. Now, check which scopes were granted.
if (tokens.scope.includes('https://www.googleapis.com/auth/yt-analytics.readonly'))
{
  // User authorized read-only Drive activity permission.
  // Calling the APIs, etc.
}
else
{
  // User didn't authorize read-only Drive activity permission.
  // Update UX and application accordingly
}

// Check if user authorized Calendar read permission.
if (tokens.scope.includes('https://www.googleapis.com/auth/calendar.readonly'))
{
  // User authorized Calendar read permission.
  // Calling the APIs, etc.
}
else
{
  // User didn't authorize Calendar read permission.
  // Update UX and application accordingly
}

HTTP/বিশ্রাম

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

উদাহরণস্বরূপ, নিম্নলিখিত নমুনা অ্যাক্সেস টোকেন প্রতিক্রিয়া ইঙ্গিত দেয় যে ব্যবহারকারী আপনার অ্যাপ্লিকেশনটিকে কেবল পঠনযোগ্য ড্রাইভ কার্যকলাপ এবং ক্যালেন্ডার ইভেন্ট অনুমতিগুলিতে অ্যাক্সেস দিয়েছেন:

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

গুগল এপিআই-তে কল করুন

পিএইচপি

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

  1. যদি আপনার কোনও নতুন Google\Client অবজেক্টে অ্যাক্সেস টোকেন প্রয়োগ করার প্রয়োজন হয় — উদাহরণস্বরূপ, যদি আপনি কোনও ব্যবহারকারীর সেশনে অ্যাক্সেস টোকেনটি সংরক্ষণ করে থাকেন — তাহলে setAccessToken পদ্ধতিটি ব্যবহার করুন:
    $client->setAccessToken($access_token);
  2. আপনি যে API কল করতে চান তার জন্য একটি পরিষেবা অবজেক্ট তৈরি করুন। আপনি যে API কল করতে চান তার জন্য কনস্ট্রাক্টরকে একটি অনুমোদিত Google\Client অবজেক্ট সরবরাহ করে একটি পরিষেবা অবজেক্ট তৈরি করুন। উদাহরণস্বরূপ, YouTube Analytics API কল করতে:
    $youtube = new Google_Service_YouTubeAnalytics($client);
  3. পরিষেবা অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, প্রমাণিত ব্যবহারকারীর চ্যানেলের জন্য একটি YouTube Analytics প্রতিবেদন পুনরুদ্ধার করতে:
    $report = $youtube->reports->query('channel==MINE', '2016-05-01', '2016-06-30', 'views');

পাইথন

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

  1. আপনি যে API কল করতে চান তার জন্য একটি পরিষেবা অবজেক্ট তৈরি করুন। আপনি googleapiclient.discovery লাইব্রেরির build পদ্ধতিতে API এর নাম এবং সংস্করণ এবং ব্যবহারকারীর শংসাপত্র সহ কল ​​করে একটি পরিষেবা অবজেক্ট তৈরি করতে পারেন: উদাহরণস্বরূপ, YouTube Analytics API এর সংস্করণ 1 কল করতে:
    from googleapiclient.discovery import build
    
    youtube = build('youtubeAnalytics', 'v1', credentials=credentials)
  2. পরিষেবা অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, প্রমাণিত ব্যবহারকারীর চ্যানেলের জন্য একটি YouTube Analytics প্রতিবেদন পুনরুদ্ধার করতে:
    report = youtube.reports().query(ids='channel==MINE', start_date='2016-05-01', end_date='2016-06-30', metrics='views').execute()

রুবি

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

  1. আপনি যে API-কে কল করতে চান তার জন্য একটি পরিষেবা অবজেক্ট তৈরি করুন। উদাহরণস্বরূপ, YouTube Analytics API-এর সংস্করণ ১ কল করতে:
    youtube = Google::Apis::YoutubeAnalyticsV1::YouTubeAnalyticsService.new
  2. পরিষেবাটিতে শংসাপত্র সেট করুন:
    youtube.authorization = credentials
  3. পরিষেবা অবজেক্ট দ্বারা প্রদত্ত ইন্টারফেস ব্যবহার করে API পরিষেবাতে অনুরোধ করুন। উদাহরণস্বরূপ, প্রমাণিত ব্যবহারকারীর চ্যানেলের জন্য একটি YouTube Analytics প্রতিবেদন পুনরুদ্ধার করতে:
    report = youtube.query_report('channel==MINE', '2016-05-01', '2016-06-30', 'views')

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

report = youtube.query_report('channel==MINE', '2016-05-01', '2016-06-30', 'views', options: { authorization: auth_client })

নোড.জেএস

একটি অ্যাক্সেস টোকেন পাওয়ার পর এবং এটি OAuth2 অবজেক্টে সেট করার পর, Google API গুলিতে কল করার জন্য অবজেক্টটি ব্যবহার করুন। আপনার অ্যাপ্লিকেশনটি একটি নির্দিষ্ট ব্যবহারকারী অ্যাকাউন্ট বা পরিষেবা অ্যাকাউন্টের পক্ষে API অনুরোধগুলি অনুমোদন করতে সেই টোকেনটি ব্যবহার করতে পারে। আপনি যে API কল করতে চান তার জন্য একটি পরিষেবা অবজেক্ট তৈরি করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি ব্যবহারকারীর ড্রাইভে ফাইলের নাম তালিকাভুক্ত করার জন্য Google ড্রাইভ 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/বিশ্রাম

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

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

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

HTTP GET উদাহরণ

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

GET /youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

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

GET https://www.googleapis.com/youtube/analytics/v1/reports?access_token=access_token&ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

curl উদাহরণ

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

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

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

curl https://www.googleapis.com/youtube/analytics/v1/reports?access_token=access_token&ids=channel%3D%3DMINE&start-date=2016-05-01&end-date=2016-06-30&metrics=views

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

নিম্নলিখিত উদাহরণটি একটি JSON-ফর্ম্যাটেড অবজেক্ট প্রিন্ট করে যা প্রমাণিত ব্যবহারকারীর YouTube চ্যানেলের ভিউ ডেটা দেখায় যখন ব্যবহারকারী অ্যাপ্লিকেশনটিকে YouTube Analytics রিপোর্ট পুনরুদ্ধার করার অনুমতি দেয়।

পিএইচপি

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

  1. মধ্যে API Console, পুনঃনির্দেশ URL-এর তালিকায় স্থানীয় মেশিনের URL যোগ করুন। উদাহরণস্বরূপ, http://localhost:8080 যোগ করুন।
  2. একটি নতুন ডিরেক্টরি তৈরি করুন এবং এতে পরিবর্তন করুন। উদাহরণস্বরূপ:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. কম্পোজার ব্যবহার করে পিএইচপির জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:
    composer require google/apiclient:^2.15.0
  4. নিম্নলিখিত কন্টেন্ট দিয়ে index.php এবং oauth2callback.php ফাইল তৈরি করুন।
  5. 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_secret.json');

// User granted permission as an access token is in the session.
if (isset($_SESSION['access_token']) && $_SESSION['access_token'])
{
  $client->setAccessToken($_SESSION['access_token']);
  
  // Check if user granted Drive permission
  if ($_SESSION['granted_scopes_dict']['Drive']) {
    echo "Drive feature is enabled.";
    echo "</br>";
    $drive = new Drive($client);
    $files = array();
    $response = $drive->files->listFiles(array());
    foreach ($response->files as $file) {
        echo "File: " . $file->name . " (" . $file->id . ")";
        echo "</br>";
    }
  } else {
    echo "Drive feature is NOT enabled.";
    echo "</br>";
  }

   // Check if user granted Calendar permission
  if ($_SESSION['granted_scopes_dict']['Calendar']) {
    echo "Calendar feature is enabled.";
    echo "</br>";
  } else {
    echo "Calendar feature is NOT enabled.";
    echo "</br>";
  }
}
else
{
  // Redirect users to outh2call.php which redirects users to Google OAuth 2.0
  $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();

// Required, call the setAuthConfig function to load authorization credentials from
// client_secret.json file.
$client->setAuthConfigFile('client_secret.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST']. $_SERVER['PHP_SELF']);

// Required, to set the scope value, call the addScope function.
$client->addScope(Google_Service_YouTubeAnalytics::YT_ANALYTICS_READONLY);

// Enable incremental authorization. Recommended as a best practice.
$client->setIncludeGrantedScopes(true);

// 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");

// Generate a URL for authorization as it doesn't contain code and error
if (!isset($_GET['code']) && !isset($_GET['error']))
{
  // Generate and set state value
  $state = bin2hex(random_bytes(16));
  $client->setState($state);
  $_SESSION['state'] = $state;

  // Generate a url that asks permissions.
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
}

// User authorized the request and authorization code is returned to exchange access and
// refresh tokens.
if (isset($_GET['code']))
{
  // Check the state value
  if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) {
    die('State mismatch. Possible CSRF attack.');
  }

  // Get access and refresh tokens (if access_type is offline)
  $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);

  /** Save access and refresh token to the session variables.
    * ACTION ITEM: In a production app, you likely want to save the
    *              refresh token in a secure persistent storage instead. */
  $_SESSION['access_token'] = $token;
  $_SESSION['refresh_token'] = $client->getRefreshToken();
  
  // Space-separated string of granted scopes if it exists, otherwise null.
  $granted_scopes = $client->getOAuth2Service()->getGrantedScope();

  // Determine which scopes user granted and build a dictionary
  $granted_scopes_dict = [
    'Drive' => str_contains($granted_scopes, Google\Service\Drive::DRIVE_METADATA_READONLY),
    'Calendar' => str_contains($granted_scopes, Google\Service\Calendar::CALENDAR_READONLY)
  ];
  $_SESSION['granted_scopes_dict'] = $granted_scopes_dict;
  
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

// An error response e.g. error=access_denied
if (isset($_GET['error']))
{
  echo "Error: ". $_GET['error'];
}
?>

পাইথন

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

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

import os
import flask
import json
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"

# The OAuth 2.0 access scope allows for access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/yt-analytics.readonly',
          'https://www.googleapis.com/auth/calendar.readonly']
API_SERVICE_NAME = 'youtubeAnalytics'
API_VERSION = 'v1'

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('/drive')
def drive_api_request():
  if 'credentials' not in flask.session:
    return flask.redirect('authorize')

  features = flask.session['features']

  if features['drive']:
    # Load client secrets from the server-side file.
    with open(CLIENT_SECRETS_FILE, 'r') as f:
        client_config = json.load(f)['web']

    # Load user-specific credentials from browser session storage.
    session_credentials = flask.session['credentials']

    # Reconstruct the credentials object.
    credentials = google.oauth2.credentials.Credentials(
        refresh_token=session_credentials.get('refresh_token'),
        scopes=session_credentials.get('granted_scopes'),
        token=session_credentials.get('token'),
        client_id=client_config.get('client_id'),
        client_secret=client_config.get('client_secret'),
        token_uri=client_config.get('token_uri'))

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

    report = youtube.reports().query(ids='channel==MINE', start_date='2016-05-01', end_date='2016-06-30', metrics='views').execute()

    # Save credentials back to session in case access token was refreshed.
    flask.session['credentials'] = credentials_to_dict(credentials)

    return flask.jsonify(**report)
  else:
    # User didn't authorize read-only Drive activity permission.
    return '<p>Drive feature is not enabled.</p>'

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

  features = flask.session['features']

  if features['calendar']:
    # User authorized Calendar read permission.
    # Calling the APIs, etc.
    return ('<p>User granted the Google Calendar read permission. '+
            'This sample code does not include code to call Calendar</p>')
  else:
    # User didn't authorize Calendar read permission.
    # Update UX and application accordingly
    return '<p>Calendar feature is not enabled.</p>'

@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
  
  credentials = credentials_to_dict(credentials)
  flask.session['credentials'] = credentials

  # Check which scopes user granted
  features = check_granted_scopes(credentials)
  flask.session['features'] = features
  return flask.redirect('/')
  
@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.')

  # Load client secrets from the server-side file.
  with open(CLIENT_SECRETS_FILE, 'r') as f:
      client_config = json.load(f)['web']

  # Load user-specific credentials from the session.
  session_credentials = flask.session['credentials']

  # Reconstruct the credentials object.
  credentials = google.oauth2.credentials.Credentials(
      refresh_token=session_credentials.get('refresh_token'),
      scopes=session_credentials.get('granted_scopes'),
      token=session_credentials.get('token'),
      client_id=client_config.get('client_id'),
      client_secret=client_config.get('client_secret'),
      token_uri=client_config.get('token_uri'))

  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:
    # Clear the user's session credentials after successful revocation
    if 'credentials' in flask.session:
        del flask.session['credentials']
        del flask.session['features']
    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,
          'granted_scopes': credentials.granted_scopes}

def check_granted_scopes(credentials):
  features = {}
  if 'https://www.googleapis.com/auth/yt-analytics.readonly' in credentials['granted_scopes']:
    features['drive'] = True
  else:
    features['drive'] = False

  if 'https://www.googleapis.com/auth/calendar.readonly' in credentials['granted_scopes']:
    features['calendar'] = True
  else:
    features['calendar'] = False

  return features

def print_index_table():
  return ('<table>' + 
          '<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="/drive">Call Drive API directly</a></td>' +
          '<td> Use stored credentials to call the API, you still might not be prompted to reauthorize ' +
          '    the application.</td></tr>' +
          '<tr><td><a href="/calendar">Call Calendar API directly</a></td>' +
          '<td> Use stored credentials to call the API, 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="/authorize">authorize</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'

  # This disables the requested scopes and granted scopes check.
  # If users only grant partial request, the warning would not be thrown.
  os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '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 'googleauth'
require 'googleauth/web_user_authorizer'
require 'googleauth/stores/redis_token_store'

require 'google/apis/youtube_analytics_v1'
require 'google/apis/calendar_v3'

require 'sinatra'

configure do
  enable :sessions

  # Required, call the from_file method to retrieve the client ID from a
  # client_secret.json file.
  set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json')

  # Required, scope value
  # Access scopes for two non-Sign-In scopes: Read-only Drive activity and Google Calendar.
  scope = ['Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY',
           'Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY']

  # Required, Authorizers require a storage instance to manage long term persistence of
  # access and refresh tokens.
  set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)

  # 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.
  set :callback_uri, '/oauth2callback'

  # 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.
  set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope,
                          settings.token_store, callback_uri: settings.callback_uri)
end

get '/' do
  # NOTE: Assumes the user is already authenticated to the app
  user_id = request.session['user_id']

  # Fetch stored credentials for the user from the given request session.
  # nil if none present
  credentials = settings.authorizer.get_credentials(user_id, request)

  if credentials.nil?
    # Generate a url that asks the user to authorize requested scope(s).
    # Then, redirect user to the url.
    redirect settings.authorizer.get_authorization_url(request: request)
  end
  
  # User authorized the request. Now, check which scopes were granted.
  if credentials.scope.include?(Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY)
    # User authorized read-only Drive activity permission.
    # Example of using Google Drive API to list filenames in user's Drive.
    youtube = Google::Apis::YoutubeAnalyticsV1::YouTubeAnalyticsService.new
    report = youtube.query_report('channel==MINE', '2016-05-01', '2016-06-30', 'views', options: { authorization: auth_client })
    
    "<pre>#{JSON.pretty_generate(report.to_h)}</pre>"
  else
    # User didn't authorize read-only Drive activity permission.
    # Update UX and application accordingly
  end

  # Check if user authorized Calendar read permission.
  if credentials.scope.include?(Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY)
    # User authorized Calendar read permission.
    # Calling the APIs, etc.
  else
    # User didn't authorize Calendar read permission.
    # Update UX and application accordingly
  end
end

# Receive the callback from Google's OAuth 2.0 server.
get '/oauth2callback' do
  # Handle the result of the oauth callback. Defers the exchange of the code by
  # temporarily stashing the results in the user's session.
  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url
end

নোড.জেএস

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

  1. মধ্যে API Console, পুনঃনির্দেশ URL-এর তালিকায় স্থানীয় মেশিনের URL যোগ করুন। উদাহরণস্বরূপ, http://localhost যোগ করুন।
  2. নিশ্চিত করুন যে আপনার রক্ষণাবেক্ষণ LTS, সক্রিয় LTS, অথবা Node.js এর বর্তমান রিলিজ ইনস্টল করা আছে।
  3. একটি নতুন ডিরেক্টরি তৈরি করুন এবং এতে পরিবর্তন করুন। উদাহরণস্বরূপ:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. npm ব্যবহার করে Node.js এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ইনস্টল করুন:
    npm install googleapis
  5. নিম্নলিখিত বিষয়বস্তু দিয়ে main.js ফাইল তৈরি করুন।
  6. উদাহরণটি চালান:
    node .\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 two non-Sign-In scopes: Read-only Drive activity and Google Calendar.
const scopes = [
  'https://www.googleapis.com/auth/yt-analytics.readonly',
  'https://www.googleapis.com/auth/calendar.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 and Google Calendar 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;
      
      // User authorized the request. Now, check which scopes were granted.
      if (tokens.scope.includes('https://www.googleapis.com/auth/yt-analytics.readonly'))
      {
        // User authorized read-only Drive activity permission.
        // 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.');
          }
        });
      }
      else
      {
        // User didn't authorize read-only Drive activity permission.
        // Update UX and application accordingly
      }

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

  // 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(8080);
}
main().catch(console.error);

HTTP/বিশ্রাম

এই পাইথনের উদাহরণটি OAuth 2.0 ওয়েব ফ্লো প্রদর্শনের জন্য Flask ফ্রেমওয়ার্ক এবং Requests লাইব্রেরি ব্যবহার করে। আমরা এই ফ্লোটির জন্য Python-এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি। (পাইথন ট্যাবের উদাহরণটি ক্লায়েন্ট লাইব্রেরি ব্যবহার করে।)

import json
import flask
import requests

app = flask.Flask(__name__)

# To get these credentials (CLIENT_ID CLIENT_SECRET) and for your application, visit
# https://console.cloud.google.com/apis/credentials.
CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123'  # Read from a file or environmental variable in a real app

# Access scopes for two non-Sign-In scopes: Read-only Drive activity and Google Calendar.
SCOPE = 'https://www.googleapis.com/auth/yt-analytics.readonly https://www.googleapis.com/auth/calendar.readonly'

# 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.
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: 
    # User authorized the request. Now, check which scopes were granted.
    if 'https://www.googleapis.com/auth/drive.metadata.readonly' in credentials['scope']:
      # User authorized read-only Drive activity permission.
      # Example of using Google Drive API to list filenames in user's Drive.
      headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
      req_uri = 'https://www.googleapis.com/youtube/analytics/v1/reports'
      r = requests.get(req_uri, headers=headers).text
    else:
      # User didn't authorize read-only Drive activity permission.
      # Update UX and application accordingly
      r = 'User did not authorize Drive permission.'

    # Check if user authorized Calendar read permission.
    if 'https://www.googleapis.com/auth/calendar.readonly' in credentials['scope']:
      # User authorized Calendar read permission.
      # Calling the APIs, etc.
      r += 'User authorized Calendar permission.'
    else:
      # User didn't authorize Calendar read permission.
      # Update UX and application accordingly
      r += 'User did not authorize Calendar permission.'

  return r

@app.route('/oauth2callback')
def oauth2callback():
  if 'code' not in flask.request.args:
    state = str(uuid.uuid4())
    flask.session['state'] = state
    # Generate a url that asks permissions for the Drive activity
    # and Google Calendar scope. Then, redirect user to the url.
    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'}

    # Exchange authorization code for access and refresh tokens (if access_type is offline)
    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()

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

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

বৈধকরণের নিয়ম
পরিকল্পনা

রিডাইরেক্ট URI গুলিকে HTTPS স্কিম ব্যবহার করতে হবে, প্লেইন HTTP নয়। Localhost URI গুলি (localhost IP ঠিকানা URI সহ) এই নিয়ম থেকে মুক্ত।

হোস্ট

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

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

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

    পথ

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

    প্রশ্ন

    পুনঃনির্দেশ URI গুলিতে খোলা পুনঃনির্দেশ থাকতে পারে না।

    খণ্ড

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

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

    বর্ধিত অনুমোদন

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

    উদাহরণস্বরূপ, ধরুন একটি অ্যাপ YouTube Analytics রিপোর্ট পুনরুদ্ধার করে, যার মধ্যে কিছু আর্থিক রিপোর্টের জন্য অতিরিক্ত স্কোপে অ্যাক্সেসের প্রয়োজন হয় যা অন্যান্য রিপোর্টের জন্য প্রয়োজন হয় না। এই ক্ষেত্রে, সাইন-ইন করার সময়, অ্যাপটি কেবল https://www.googleapis.com/auth/yt-analytics.readonly স্কোপে অ্যাক্সেসের অনুরোধ করতে পারে। তবে, যদি ব্যবহারকারী একটি আর্থিক রিপোর্ট পুনরুদ্ধার করার চেষ্টা করেন, তাহলে অ্যাপটি https://www.googleapis.com/auth/yt-analytics-monetary.readonly স্কোপে অ্যাক্সেসের অনুরোধ করতে পারে।

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

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

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

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

    পিএইচপি

    $client->setIncludeGrantedScopes(true);

    পাইথন

    পাইথনে, 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"}
    )

    নোড.জেএস

    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/বিশ্রাম

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

    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 ক্লায়েন্ট ব্যবহার চালিয়ে যেতে পারেন। প্রয়োজন অনুসারে ক্লায়েন্ট অবজেক্ট অ্যাক্সেস টোকেনটি রিফ্রেশ করবে।

    নোড.জেএস

    যদি আপনার অ্যাপ্লিকেশনটির কোনও 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/বিশ্রাম

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

    ক্ষেত্র
    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&
    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 https://www.googleapis.com/auth/calendar.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 এন্ডপয়েন্টে একটি HTTP অনুরোধ করুন:

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

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

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

    নোড.জেএস

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

    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/বিশ্রাম

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

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

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

    আপনার ব্যবহারকারীদের অ্যাকাউন্ট সুরক্ষিত রাখার জন্য আপনার আরও একটি পদক্ষেপ নেওয়া উচিত, তা হল 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

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