Google আইডেন্টিটি সার্ভিসে মাইগ্রেট করুন

সংক্ষিপ্ত বিবরণ

গুগল এপিআই কল করার জন্য ব্যবহারকারী-ভিত্তিক অ্যাক্সেস টোকেন পেতে, গুগল একাধিক জাভাস্ক্রিপ্ট লাইব্রেরি সরবরাহ করে:

এই নির্দেশিকাটি পূর্ববর্তী লাইব্রেরিগুলো থেকে গুগল আইডেন্টিটি সার্ভিসেস লাইব্রেরিতে স্থানান্তরের নির্দেশনা প্রদান করে।

এই নির্দেশিকা অনুসরণ করলে আপনি যা যা করতে পারবেন:

  • অপ্রচলিত প্ল্যাটফর্ম লাইব্রেরিটিকে আইডেন্টিটি সার্ভিসেস লাইব্রেরি দিয়ে প্রতিস্থাপন করুন, এবং
  • এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, অপ্রচলিত gapi.auth2 মডিউল, এর মেথড এবং অবজেক্টগুলো সরিয়ে ফেলুন এবং সেগুলোর পরিবর্তে আইডেন্টিটি সার্ভিসেস-এর সমতুল্য উপাদান ব্যবহার করুন।

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

আপনি যদি ব্যবহারকারী সাইন-আপ এবং সাইন-ইন এর জন্য প্রমাণীকরণ খুঁজে থাকেন, তাহলে এর পরিবর্তে 'গুগল সাইন-ইন থেকে মাইগ্রেট করা' দেখুন।

আপনার অনুমোদন প্রবাহ শনাক্ত করুন

ব্যবহারকারী অনুমোদনের দুটি সম্ভাব্য প্রক্রিয়া রয়েছে: অন্তর্নিহিত এবং অনুমোদন কোড।

আপনার ওয়েব অ্যাপে কোন ধরনের অনুমোদন প্রক্রিয়া ব্যবহৃত হচ্ছে তা শনাক্ত করতে অ্যাপটি পর্যালোচনা করুন

আপনার ওয়েব অ্যাপটি যে ইমপ্লিসিট ফ্লো ব্যবহার করছে তার লক্ষণ:

  • আপনার ওয়েব অ্যাপটি সম্পূর্ণরূপে ব্রাউজার ভিত্তিক, এর কোনো ব্যাকএন্ড প্ল্যাটফর্ম নেই।
  • গুগল এপিআই কল করার জন্য ব্যবহারকারীকে অবশ্যই উপস্থিত থাকতে হবে, আপনার অ্যাপটি শুধুমাত্র অ্যাক্সেস টোকেন ব্যবহার করে এবং এর জন্য রিফ্রেশ টোকেনের প্রয়োজন হয় না।
  • আপনার ওয়েব অ্যাপ apis.google.com/js/api.js লোড করে।
  • আপনার বাস্তবায়নটি ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশনের জন্য OAuth 2.0-এর উপর ভিত্তি করে তৈরি।
  • আপনার অ্যাপটি Google API Client Library for JavaScript- এ থাকা gapi.client অথবা gapi.auth2 মডিউলগুলোর যেকোনো একটি ব্যবহার করে।

আপনার ওয়েব অ্যাপটি যে অনুমোদন কোড প্রবাহ ব্যবহার করছে তার লক্ষণ:

  • আপনার বাস্তবায়ন নিম্নলিখিত বিষয়ের উপর ভিত্তি করে তৈরি:

  • আপনার অ্যাপটি ব্যবহারকারীর ব্রাউজারে এবং আপনার ব্যাকএন্ড প্ল্যাটফর্মে, উভয় স্থানেই চলে।

  • আপনার ব্যাকএন্ড প্ল্যাটফর্মে একটি অথরাইজেশন কোড এন্ডপয়েন্ট রয়েছে।

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

  • রিফ্রেশ টোকেনগুলো আপনার ব্যাকএন্ড প্ল্যাটফর্ম দ্বারা পরিচালিত ও সংরক্ষিত হয়।

কোনো কোনো ক্ষেত্রে, আপনার কোডবেস উভয় ফ্লো-ই সমর্থন করতে পারে।

একটি অনুমোদন প্রবাহ বেছে নিন

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

দুটি অথরাইজেশন ফ্লো-এর মধ্যেকার মূল পার্থক্য এবং সুবিধা-অসুবিধাগুলো বোঝার জন্য একটি ফ্লো বেছে নেওয়ার বিষয়টি পর্যালোচনা করুন।

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

সিলেক্টরগুলো ব্যবহার করে একটি অনুমোদন প্রক্রিয়া বেছে নিন

অন্তর্নিহিত প্রবাহ

ব্যবহারকারীর উপস্থিতিতে ব্রাউজারে ব্যবহারের জন্য একটি অ্যাক্সেস টোকেন সংগ্রহ করুন।

ইমপ্লিসিট ফ্লো-এর উদাহরণগুলো আইডেন্টিটি সার্ভিসেস-এ মাইগ্রেশনের আগের ও পরের ওয়েব অ্যাপগুলো দেখায়।

অনুমোদন কোড প্রবাহ

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

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

এই নির্দেশিকা জুড়ে, বিদ্যমান কার্যকারিতা যোগ করতে , সরাতে , আপডেট করতে বা প্রতিস্থাপন করতে গাঢ় অক্ষরে তালিকাভুক্ত নির্দেশনাগুলো অনুসরণ করুন।

আপনার ইন-ব্রাউজার ওয়েব অ্যাপে পরিবর্তন

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

প্রভাবিত কোড শনাক্ত করুন এবং পরীক্ষা করুন

একটি ডিবাগ কুকি প্রভাবিত কোড সনাক্ত করতে এবং অপ্রচলিত হওয়ার পরবর্তী আচরণ পরীক্ষা করতে সাহায্য করতে পারে।

বড় বা জটিল অ্যাপে, gapi.auth2 মডিউলটি বাতিল হওয়ার কারণে প্রভাবিত সমস্ত কোড খুঁজে পাওয়া কঠিন হতে পারে। শীঘ্রই বাতিল হতে চলা কার্যকারিতার বর্তমান ব্যবহার কনসোলে লগ করার জন্য, G_AUTH2_MIGRATION কুকির মান informational এ সেট করুন। ঐচ্ছিকভাবে, সেশন স্টোরেজেও লগ করার জন্য একটি কোলনের পরে একটি কী ভ্যালু যোগ করুন। সাইন-ইন এবং ক্রেডেনশিয়াল প্রাপ্তির পরে, পরবর্তী বিশ্লেষণের জন্য সংগৃহীত লগগুলি পর্যালোচনা করুন বা একটি ব্যাকএন্ডে পাঠান। উদাহরণস্বরূপ, informational:showauth2use showauth2use নামের একটি সেশন স্টোরেজ কী-তে অরিজিন এবং ইউআরএল সংরক্ষণ করে।

gapi.auth2 মডিউলটি আর লোড না হলে অ্যাপের আচরণ যাচাই করতে, G_AUTH2_MIGRATION কুকিটির মান ' enforced এ সেট করুন। এটি এনফোর্সমেন্ট তারিখের আগেই ডেপ্রিকেশন-পরবর্তী আচরণ পরীক্ষা করার সুযোগ দেয়।

G_AUTH2_MIGRATION কুকির সম্ভাব্য মানসমূহ:

  • gapi.auth2 মডিউল লোড করা enforced নয়।
  • অপ্রচলিত কার্যকারিতার informational ব্যবহার JS কনসোলে লগ করুন। এছাড়াও, যখন একটি ঐচ্ছিক কী-নেম ( informational:key-name ) সেট করা হয়, তখন সেশন স্টোরেজেও লগ করুন।

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

লাইব্রেরি এবং মডিউল

gapi.auth2 মডিউলটি সাইন-ইন-এর জন্য ব্যবহারকারীর প্রমাণীকরণ এবং অনুমোদনের অন্তর্নিহিত প্রবাহ পরিচালনা করে; এই অপ্রচলিত মডিউল এবং এর অবজেক্ট ও মেথডগুলোকে Google Identity Services লাইব্রেরি দিয়ে প্রতিস্থাপন করুন।

আপনার ডকুমেন্টে Identity Services লাইব্রেরিটি অন্তর্ভুক্ত করে আপনার ওয়েব অ্যাপে এটি যোগ করুন :

<script src="https://accounts.google.com/gsi/client" async defer></script>

gapi.load('auth2', function) ব্যবহার করে auth2 মডিউল লোড করার সমস্ত দৃষ্টান্ত মুছে ফেলুন

Google Identity Services লাইব্রেরিটি gapi.auth2 মডিউলের ব্যবহার প্রতিস্থাপন করে। আপনি Google API Client Library for JavaScript থেকে gapi.client মডিউলটি নিরাপদে ব্যবহার করা চালিয়ে যেতে পারেন এবং একটি ডিসকভারি ডকুমেন্ট থেকে কলযোগ্য JS মেথড স্বয়ংক্রিয়ভাবে তৈরি করা, একাধিক API কল ব্যাচিং করা এবং CORS ম্যানেজমেন্ট কার্যকারিতার সুবিধা নিতে পারেন।

কুকি

ব্যবহারকারীর অনুমোদনের জন্য কুকি ব্যবহারের প্রয়োজন নেই।

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

যোগ্যতা

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

এই পরিবর্তনগুলো দেখতে, নমুনা পরিচয়পত্রগুলো দেখুন।

অন্তর্নিহিত প্রবাহ

অথরাইজেশন ফ্লো থেকে ইউজার প্রোফাইল হ্যান্ডলিং বাদ দিয়ে ইউজার অথেন্টিকেশন এবং অথরাইজেশন পৃথক করুন।

এই গুগল সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি সরিয়ে ফেলুন :

পদ্ধতি

  • GoogleUser.getBasicProfile()
  • GoogleUser.getId()

অনুমোদন কোড প্রবাহ

আইডেন্টিটি সার্ভিসেস ব্রাউজারের ক্রেডেনশিয়ালগুলোকে আইডি টোকেন এবং অ্যাক্সেস টোকেনে বিভক্ত করে। এই পরিবর্তনটি আপনার ব্যাকএন্ড প্ল্যাটফর্ম থেকে সরাসরি Google OAuth 2.0 এন্ডপয়েন্টে কল করার মাধ্যমে অথবা আপনার প্ল্যাটফর্মের কোনো সুরক্ষিত সার্ভারে চলমান লাইব্রেরি, যেমন Google APIs Node.js ক্লায়েন্টের মাধ্যমে প্রাপ্ত ক্রেডেনশিয়ালগুলোর ক্ষেত্রে প্রযোজ্য নয়।

সেশন অবস্থা

পূর্বে, গুগল সাইন-ইন আপনাকে নিম্নলিখিত উপায়ে ব্যবহারকারীর সাইন-ইন অবস্থা পরিচালনা করতে সাহায্য করত:

আপনার ওয়েব অ্যাপের সাইন-ইন অবস্থা এবং ব্যবহারকারীর সেশন পরিচালনার দায়িত্ব আপনার।

এই গুগল সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি সরিয়ে ফেলুন :

বস্তুসমূহ:

  • gapi.auth2.SignInOptions

পদ্ধতি:

  • GoogleAuth.attachClickHandler()
  • GoogleAuth.isSignedIn()
  • GoogleAuth.isSignedIn.get()
  • GoogleAuth.isSignedIn.listen()
  • GoogleAuth.signIn()
  • GoogleAuth.signOut()
  • GoogleAuth.currentUser.get()
  • GoogleAuth.currentUser.listen()
  • GoogleUser.isSignedIn()

ক্লায়েন্ট কনফিগারেশন

ইমপ্লিসিট বা অথরাইজেশন কোড ফ্লো-এর জন্য একটি টোকেন ক্লায়েন্ট ইনিশিয়ালাইজ করতে আপনার ওয়েব অ্যাপটি আপডেট করুন।

এই গুগল সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি সরিয়ে ফেলুন :

বস্তুসমূহ:

  • gapi.auth2.ClientConfig
  • gapi.auth2.OfflineAccessOptions

পদ্ধতি:

  • gapi.auth2.getAuthInstance()
  • GoogleUser.grant()

অন্তর্নিহিত প্রবাহ

আপনার ওয়েব অ্যাপ কনফিগার করতে, 'initialize a token client'-এর উদাহরণ অনুসরণ করে একটি TokenClientConfig অবজেক্ট এবং initTokenClient() কল যোগ করুন

Google Sign-In জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলিকে Google Identity Services দিয়ে প্রতিস্থাপন করুন :

বস্তুসমূহ:

  • gapi.auth2.AuthorizeConfig with TokenClientConfig

পদ্ধতি:

  • gapi.auth2.init() এর সাথে google.accounts.oauth2.initTokenClient()

পরামিতি:

  • gapi.auth2.AuthorizeConfig.login_hint এর সাথে TokenClientConfig.login_hint .
  • gapi.auth2.GoogleUser.getHostedDomain() with TokenClientConfig.hd .

অনুমোদন কোড প্রবাহ

আপনার ওয়েব অ্যাপ কনফিগার করতে, একটি CodeClientConfig অবজেক্ট যোগ করুন এবং initCodeClient() কল করুন, এবং এর জন্য Code Client ইনিশিয়ালাইজ করার উদাহরণটি অনুসরণ করুন।

অন্তর্নিহিত থেকে অনুমোদন কোড প্রবাহে পরিবর্তন করার সময়:

গুগল সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি সরান

বস্তুসমূহ:

  • gapi.auth2.AuthorizeConfig

পদ্ধতি:

  • gapi.auth2.init()

পরামিতি:

  • gapi.auth2.AuthorizeConfig.login_hint
  • gapi.auth2.GoogleUser.getHostedDomain()

টোকেন অনুরোধ

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

অন্তর্নিহিত প্রবাহ

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

Google Sign-In জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি Google Identity Services দিয়ে প্রতিস্থাপন করুন

পদ্ধতি:

  • gapi.auth2.authorize() with TokenClient.requestAccessToken()
  • GoogleUser.reloadAuthResponse() with TokenClient.requestAccessToken()

অ্যাক্সেস টোকেনের অনুরোধ করতে, অথবা বিদ্যমান টোকেনের মেয়াদ শেষ হয়ে গেলে একটি নতুন টোকেন পেতে, requestAccessToken() ফাংশনটি কল করার জন্য একটি লিঙ্ক বা বাটন যোগ করুন, যা পপ-আপ ইউএক্স ফ্লো শুরু করবে।

আপনার কোডবেস আপডেট করুন :

  • requestAccessToken() ব্যবহার করে OAuth 2.0 টোকেন প্রবাহটি চালু করুন
  • requestAccessToken এবং OverridableTokenClientConfig ব্যবহার করে বিভিন্ন স্কোপের জন্য একটি অনুরোধকে একাধিক ছোট ছোট অনুরোধে বিভক্ত করার মাধ্যমে ইনক্রিমেন্টাল অথরাইজেশন সমর্থন করুন।
  • বিদ্যমান টোকেনের মেয়াদ শেষ হয়ে গেলে বা তা বাতিল করা হলে একটি নতুন টোকেনের জন্য অনুরোধ করুন।

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

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

অনুমোদন কোড প্রবাহ

গুগল থেকে একটি অনুমোদন কোড অনুরোধ করার জন্য requestCode() কল করতে একটি লিঙ্ক বা বাটন যোগ করুন । একটি উদাহরণের জন্য, Trigger OAuth 2.0 Code Flow দেখুন।

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

টোকেন পরিচালনা

মেয়াদোত্তীর্ণ বা বাতিল করা অ্যাক্সেস টোকেন ব্যবহার করা হলে Google API কল ব্যর্থ হলে তা শনাক্ত করতে এবং একটি নতুন, বৈধ অ্যাক্সেস টোকেনের জন্য অনুরোধ করতে ত্রুটি ব্যবস্থাপনা যোগ করুন

মেয়াদোত্তীর্ণ বা বাতিল করা অ্যাক্সেস টোকেন ব্যবহার করা হলে Google API-গুলি 401 Unauthorized HTTP স্ট্যাটাস কোড এবং invalid_token ত্রুটি বার্তা ফেরত দেয়। একটি উদাহরণের জন্য, Invalid token response দেখুন।

মেয়াদোত্তীর্ণ টোকেন

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

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

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

Google Sign-In জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি Google Identity Services দিয়ে প্রতিস্থাপন করুন

পদ্ধতি:

  • getAuthInstance().disconnect() এর সাথে google.accounts.oauth2.revoke()
  • GoogleUser.disconnect() এর সাথে google.accounts.oauth2.revoke()

যখন কোনো ব্যবহারকারী আপনার প্ল্যাটফর্ম থেকে তার অ্যাকাউন্ট মুছে ফেলেন, অথবা আপনার অ্যাপের সাথে ডেটা শেয়ার করার সম্মতি প্রত্যাহার করতে চান, তখন revoke কল করুন।

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

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

ব্যবহারকারীর সাইন-ইন

ব্যবহারকারীরা একটি আলাদা ব্রাউজার ট্যাবে, অথবা সরাসরি ব্রাউজার বা অপারেটিং সিস্টেমের মাধ্যমে একটি গুগল অ্যাকাউন্টে সাইন ইন করতে পারেন। ব্যবহারকারী যখন প্রথমবার আপনার অ্যাপটি খুলবেন, তখন গুগল অ্যাকাউন্ট এবং ব্রাউজারের মধ্যে একটি সক্রিয় সেশন স্থাপন করার জন্য আমরা আপনার সাইটে ‘সাইন ইন উইথ গুগল’ (Sign In With Google) যোগ করার পরামর্শ দিই। এটি করলে নিম্নলিখিত সুবিধাগুলো পাওয়া যায়:

  • ব্যবহারকারীকে বারবার সাইন-ইন করার প্রয়োজনীয়তা কমিয়ে আনে; যদি আগে থেকে কোনো সক্রিয় সেশন না থাকে, তবে একটি অ্যাক্সেস টোকেনের অনুরোধ স্বয়ংক্রিয়ভাবে গুগল অ্যাকাউন্টে সাইন-ইন প্রক্রিয়া শুরু করে।
  • CodeClientConfig বা TokenClientConfig অবজেক্টের login_hint প্যারামিটারের মান হিসেবে সরাসরি JWT ID টোকেন ক্রেডেনশিয়াল email ফিল্ডটি ব্যবহার করুন। এটি বিশেষভাবে সহায়ক হয় যদি আপনার প্ল্যাটফর্মে কোনো ব্যবহারকারী অ্যাকাউন্ট ব্যবস্থাপনা সিস্টেম না থাকে।
  • আপনার প্ল্যাটফর্মে বিদ্যমান স্থানীয় ব্যবহারকারী অ্যাকাউন্টের সাথে একটি গুগল অ্যাকাউন্ট খুঁজে বের করে সংযুক্ত করুন, যা আপনার প্ল্যাটফর্মে ডুপ্লিকেট অ্যাকাউন্টের সংখ্যা কমাতে সাহায্য করবে।
  • যখন একটি নতুন স্থানীয় অ্যাকাউন্ট তৈরি করা হয়, তখন আপনার সাইন-আপ ডায়ালগ ও প্রক্রিয়াকে ব্যবহারকারী প্রমাণীকরণ ডায়ালগ ও প্রক্রিয়া থেকে স্পষ্টভাবে আলাদা করা যেতে পারে, যা প্রয়োজনীয় ধাপের সংখ্যা কমায় এবং ড্রপ-অফ রেট উন্নত করে।

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

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

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

অন্তর্নিহিত প্রবাহ

Google Sign-In জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলিকে Google Identity Services দিয়ে প্রতিস্থাপন করুন :

বস্তুসমূহ:

  • gapi.auth2.AuthorizeResponse with TokenClient.TokenResponse
  • gapi.auth2.AuthResponse with TokenClient.TokenResponse

পদ্ধতি:

  • GoogleUser.hasGrantedScopes() এর সাথে google.accounts.oauth2.hasGrantedAllScopes()
  • GoogleUser.getGrantedScopes() এর সাথে google.accounts.oauth2.hasGrantedAllScopes()

গুগল সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্সগুলি সরান :

পদ্ধতি:

  • GoogleUser.getAuthResponse()

এই গ্র্যানুলার পারমিশন উদাহরণটি অনুসরণ করে আপনার ওয়েব অ্যাপটি hasGrantedAllScopes() এবং hasGrantedAnyScope() দিয়ে আপডেট করুন

অনুমোদন কোড প্রবাহ

অথরাইজেশন কোড হ্যান্ডলিং- এর নির্দেশাবলী অনুসরণ করে আপনার ব্যাকএন্ড প্ল্যাটফর্মে একটি অথরাইজেশন কোড এন্ডপয়েন্ট আপডেট বা যোগ করুন

অনুরোধটি যাচাই করতে এবং একটি অ্যাক্সেস টোকেন ও রিফ্রেশ টোকেন পেতে, 'ইউজ কোড মডেল' গাইডে বর্ণিত ধাপগুলো অনুসরণ করার জন্য আপনার প্ল্যাটফর্মটি আপডেট করুন

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

অন্তর্নিহিত প্রবাহের উদাহরণ

পুরানো পদ্ধতি

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

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

gapi.auth2 মডিউলটি gapi.client.init() দ্বারা স্বয়ংক্রিয়ভাবে লোড ও ব্যবহৃত হয়, এবং একারণে এটি লুকানো থাকে।

<!DOCTYPE html>
  <html>
    <head>
      <script src="https://apis.google.com/js/api.js"></script>
      <script>
        function start() {
          gapi.client.init({
            'apiKey': 'YOUR_API_KEY',
            'clientId': 'YOUR_CLIENT_ID',
            'scope': 'https://www.googleapis.com/auth/cloud-translation',
            'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
          }).then(function() {
            // Execute an API request which is returned as a Promise.
            // The method name language.translations.list comes from the API discovery.
            return gapi.client.language.translations.list({
              q: 'hello world',
              source: 'en',
              target: 'de',
            });
          }).then(function(response) {
            console.log(response.result.data.translations[0].translatedText);
          }, function(reason) {
            console.log('Error: ' + reason.result.error.message);
          });
        };

        // Load the JavaScript client library and invoke start afterwards.
        gapi.load('client', start);
      </script>
    </head>
    <body>
      <div id="results"></div>
    </body>
  </html>

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

ব্যবহারকারীর সম্মতির জন্য পপ-আপ ডায়ালগ ব্যবহার করে ব্রাউজারে চলমান ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0

gapi.auth2 মডিউলটি ম্যানুয়ালি লোড করা হয়।

<!DOCTYPE html>
<html><head></head><body>
<script>
  var GoogleAuth;
  var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
  function handleClientLoad() {
    // Load the API's client and auth2 modules.
    // Call the initClient function after the modules load.
    gapi.load('client:auth2', initClient);
  }

  function initClient() {
    // In practice, your app can retrieve one or more discovery documents.
    var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';

    // Initialize the gapi.client object, which app uses to make API requests.
    // Get API key and client ID from Google Cloud console.
    // 'scope' field specifies space-delimited list of access scopes.
    gapi.client.init({
        'apiKey': 'YOUR_API_KEY',
        'clientId': 'YOUR_CLIENT_ID',
        'discoveryDocs': [discoveryUrl],
        'scope': SCOPE
    }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);

      // Handle initial sign-in state. (Determine if user is already signed in.)
      var user = GoogleAuth.currentUser.get();
      setSigninStatus();

      // Call handleAuthClick function when user clicks on
      //      "Sign In/Authorize" button.
      $('#sign-in-or-out-button').click(function() {
        handleAuthClick();
      });
      $('#revoke-access-button').click(function() {
        revokeAccess();
      });
    });
  }

  function handleAuthClick() {
    if (GoogleAuth.isSignedIn.get()) {
      // User is authorized and has clicked "Sign out" button.
      GoogleAuth.signOut();
    } else {
      // User is not signed in. Start Google auth flow.
      GoogleAuth.signIn();
    }
  }

  function revokeAccess() {
    GoogleAuth.disconnect();
  }

  function setSigninStatus() {
    var user = GoogleAuth.currentUser.get();
    var isAuthorized = user.hasGrantedScopes(SCOPE);
    if (isAuthorized) {
      $('#sign-in-or-out-button').html('Sign out');
      $('#revoke-access-button').css('display', 'inline-block');
      $('#auth-status').html('You are currently signed in and have granted ' +
          'access to this app.');
    } else {
      $('#sign-in-or-out-button').html('Sign In/Authorize');
      $('#revoke-access-button').css('display', 'none');
      $('#auth-status').html('You have not authorized this app or you are ' +
          'signed out.');
    }
  }

  function updateSigninStatus() {
    setSigninStatus();
  }
</script>

<button id="sign-in-or-out-button"
        style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
        style="display: none; margin-left: 25px">Revoke access</button>

<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
        onload="this.onload=function(){};handleClientLoad()"
        onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>

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

ব্রাউজারে চলমান ক্লায়েন্ট-সাইড ওয়েব অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 ব্যবহারকারীর সম্মতির জন্য গুগলে রিডাইরেক্ট করে।

এই উদাহরণটি ব্যবহারকারীর ব্রাউজার থেকে গুগলের OAuth 2.0 এন্ডপয়েন্টগুলিতে সরাসরি কল করা দেখাচ্ছে এবং এতে gapi.auth2 মডিউল বা কোনো জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করা হয়নি।

<!DOCTYPE html>
<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
  var fragmentString = location.hash.substring(1);

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

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
      xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.response);
        } else if (xhr.readyState === 4 && xhr.status === 401) {
          // Token invalid, so prompt for user permission.
          oauth2SignIn();
        }
      };
      xhr.send(null);
    } else {
      oauth2SignIn();
    }
  }

  /*

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

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

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

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

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

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

নতুন উপায়

শুধুমাত্র জিআইএস

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

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      var access_token;

      function initClient() {
        client = google.accounts.oauth2.initTokenClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/contacts.readonly',
          callback: (tokenResponse) => {
            access_token = tokenResponse.access_token;
          },
        });
      }
      function getToken() {
        client.requestAccessToken();
      }
      function revokeToken() {
        google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
      }
      function loadCalendar() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
        xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
        xhr.send();
      }
    </script>
    <h1>Google Identity Services Authorization Token model</h1>
    <button onclick="getToken();">Get access token</button><br><br>
    <button onclick="loadCalendar();">Load Calendar</button><br><br>
    <button onclick="revokeToken();">Revoke token</button>
  </body>
</html>

GAPI async/await

এই উদাহরণে দেখানো হয়েছে কীভাবে টোকেন মডেল ব্যবহার করে গুগল আইডেন্টিটি সার্ভিস লাইব্রেরি যুক্ত করতে হয়, gapi.auth2 মডিউলটি সরাতে হয় এবং জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে একটি এপিআই কল করতে হয়।

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

পৃষ্ঠাটি প্রথমবার লোড হওয়ার সময় অ্যাক্সেস টোকেন না থাকলে, অথবা পরে অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে, ব্যবহারকারীদের 'ক্যালেন্ডার দেখান' বোতামটি চাপতে বলা হচ্ছে।

<!DOCTYPE html>
<html>
<head>
    <title>GAPI and GIS Example</title>
    <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
    <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoad()"></script>
</head>
<body>
    <h1>GAPI Client with GIS Authorization</h1>
    <button id="authorizeBtn" style="visibility:hidden;">Authorize and Load Events</button>
    <button id="revokeBtn" style="visibility:hidden;">Revoke Access</button>
    <div id="content"></div>

    <script>
        const YOUR_CLIENT_ID = "YOUR_CLIENT_ID";
        const YOUR_API_KEY = 'YOUR_API_KEY';
        const CALENDAR_SCOPE = 'https://www.googleapis.com/auth/calendar.readonly';

        let tokenClient;
        let libsLoaded = 0;

        function gapiLoad() {
            gapi.load('client', initGapiClient);
        }

        async function initGapiClient() {
            try {
                await gapi.client.init({ apiKey: YOUR_API_KEY });
                await gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
                console.log('GAPI client initialized.');
                checkAllLoaded();
            } catch (err) {
                handleError('GAPI initialization failed:', err);
            }
        }

        function gisLoad() {
            try {
                tokenClient = google.accounts.oauth2.initTokenClient({
                    client_id: YOUR_CLIENT_ID,
                    scope: CALENDAR_SCOPE,
                    callback: '', // Will be set dynamically
                    error_callback: handleGisError,
                });
                console.log('GIS TokenClient initialized.');
                checkAllLoaded();
            } catch (err) {
                handleError('GIS initialization failed:', err);
            }
        }

        function checkAllLoaded() {
            libsLoaded++;
            if (libsLoaded === 2) {
                document.getElementById('authorizeBtn').style.visibility = 'visible';
                document.getElementById('revokeBtn').style.visibility = 'visible';
                document.getElementById('authorizeBtn').onclick = makeApiCall;
                document.getElementById('revokeBtn').onclick = revokeAccess;
                console.log('Ready to authorize.');
            }
        }

        function handleGisError(err) {
            console.error('GIS Error:', err);
            let message = 'An error occurred during authorization.';
            if (err && err.type === 'popup_failed_to_open') {
                message = 'Failed to open popup. Please disable popup blockers.';
            } else if (err && err.type === 'popup_closed') {
                message = 'Authorization popup was closed.';
            }
            document.getElementById('content').textContent = message;
        }

        function handleError(message, error) {
            console.error(message, error);
            document.getElementById('content').textContent = `${message} ${error.message || JSON.stringify(error)}`;
        }

        async function makeApiCall() {
            document.getElementById('content').textContent = 'Processing...';
            try {
                let token = gapi.client.getToken();
                if (!token || !token.access_token) {
                    console.log('No token, fetching one...');
                    await getToken();
                }

                console.log('Calling Calendar API...');
                const response = await gapi.client.calendar.events.list({ 'calendarId': 'primary' });
                displayEvents(response.result);
            } catch (err) {
                console.error('API call failed:', err);
                const errorInfo = err.result && err.result.error;
                if (errorInfo && (errorInfo.code === 401 || (errorInfo.code === 403 && errorInfo.status === "PERMISSION_DENIED"))) {
                    console.log('Auth error on API call, refreshing token...');
                    try {
                        await getToken({ prompt: 'consent' }); // Force refresh
                        const retryResponse = await gapi.client.calendar.events.list({ 'calendarId': 'primary' });
                        displayEvents(retryResponse.result);
                    } catch (refreshErr) {
                        handleError('Failed to refresh token or retry API call:', refreshErr);
                    }
                } else {
                    handleError('Error loading events:', err.result ? err.result.error : err);
                }
            }
        }

        async function getToken(options = { prompt: '' }) {
            return new Promise((resolve, reject) => {
                if (!tokenClient) return reject(new Error("GIS TokenClient not initialized."));
                tokenClient.callback = (tokenResponse) => {
                    if (tokenResponse.error) {
                        reject(new Error(`Token Error: ${tokenResponse.error} - ${tokenResponse.error_description}`));
                    } else {
                        console.log('Token acquired.');
                        resolve(tokenResponse);
                    }
                };
                tokenClient.requestAccessToken(options);
            });
        }

        function displayEvents(result) {
            const events = result.items;
            if (events && events.length > 0) {
                let eventList = '<h3>Upcoming Events:</h3><ul>' + events.map(event =>
                    `<li>${event.summary} (${event.start.dateTime || event.start.date})</li>`
                ).join('') + '</ul>';
                document.getElementById('content').innerHTML = eventList;
            } else {
                document.getElementById('content').textContent = 'No upcoming events found.';
            }
        }

        function revokeAccess() {
            const token = gapi.client.getToken();
            if (token && token.access_token) {
                google.accounts.oauth2.revoke(token.access_token, () => {
                    console.log('Access revoked.');
                    document.getElementById('content').textContent = 'Access has been revoked.';
                    gapi.client.setToken(null);
                });
            } else {
                document.getElementById('content').textContent = 'No token to revoke.';
            }
        }
    </script>
</body>
</html>

GAPI কলব্যাক

এই উদাহরণে দেখানো হয়েছে কীভাবে টোকেন মডেল ব্যবহার করে গুগল আইডেন্টিটি সার্ভিস লাইব্রেরি যুক্ত করতে হয়, gapi.auth2 মডিউলটি সরাতে হয় এবং জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি ব্যবহার করে একটি এপিআই কল করতে হয়।

লাইব্রেরি লোডিং ক্রম নির্দিষ্ট করতে ভেরিয়েবল ব্যবহার করা হয়। একটি বৈধ অ্যাক্সেস টোকেন ফেরত আসার পর কলব্যাকের ভেতর থেকে GAPI কল করা হয়।

পৃষ্ঠাটি প্রথমবার লোড হওয়ার সময় এবং ক্যালেন্ডারের তথ্য রিফ্রেশ করার জন্য ব্যবহারকারীদের 'ক্যালেন্ডার দেখান' বোতামটি চাপতে বলা হচ্ছে।

<!DOCTYPE html>
<html>
<head>
  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
  <h1>GAPI with GIS callbacks</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
  <script>
    let tokenClient;
    let gapiInited;
    let gisInited;

    document.getElementById("showEventsBtn").style.visibility="hidden";
    document.getElementById("revokeBtn").style.visibility="hidden";

    function checkBeforeStart() {
       if (gapiInited && gisInited){
          // Start only when both gapi and gis are initialized.
          document.getElementById("showEventsBtn").style.visibility="visible";
          document.getElementById("revokeBtn").style.visibility="visible";
       }
    }

    function gapiInit() {
      gapi.client.init({
        // NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
      })
      .then(function() {  // Load the Calendar API discovery document.
        gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
        gapiInited = true;
        checkBeforeStart();
      });
    }

    function gapiLoad() {
        gapi.load('client', gapiInit)
    }

    function gisInit() {
     tokenClient = google.accounts.oauth2.initTokenClient({
                client_id: 'YOUR_CLIENT_ID',
                scope: 'https://www.googleapis.com/auth/calendar.readonly',
                callback: '',  // defined at request time
            });
      gisInited = true;
      checkBeforeStart();
    }

    function showEvents() {

      tokenClient.callback = (resp) => {
        if (resp.error !== undefined) {
          throw(resp);
        }
        // GIS has automatically updated gapi.client with the newly issued access token.
        console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));

        gapi.client.calendar.events.list({ 'calendarId': 'primary' })
        .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
        .catch(err => console.log(err));

        document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
      }

      // Conditionally ask users to select the Google Account they'd like to use,
      // and explicitly obtain their consent to fetch their Calendar.
      // NOTE: To request an access token a user gesture is necessary.
      if (gapi.client.getToken() === null) {
        // Prompt the user to select a Google Account and asked for consent to share their data
        // when establishing a new session.
        tokenClient.requestAccessToken({prompt: 'consent'});
      } else {
        // Skip display of account chooser and consent dialog for an existing session.
        tokenClient.requestAccessToken({prompt: ''});
      }
    }

    function revokeToken() {
      let cred = gapi.client.getToken();
      if (cred !== null) {
        google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
        gapi.client.setToken('');
        document.getElementById("showEventsBtn").innerText = "Show Calendar";
      }
    }
  </script>
</body>
</html>

অনুমোদন কোড প্রবাহের উদাহরণ

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

পুরানো পদ্ধতি

সার্ভার-সাইড ওয়েব অ্যাপস

ব্যবহারকারীর সম্মতির জন্য গুগলে রিডাইরেক্ট ব্যবহার করে ব্যাকএন্ড প্ল্যাটফর্মে চলমান সার্ভার-সাইড অ্যাপগুলির জন্য গুগল সাইন-ইন

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
    <script>
      function start() {
        gapi.load('auth2', function() {
          auth2 = gapi.auth2.init({
            client_id: 'YOUR_CLIENT_ID',
            api_key: 'YOUR_API_KEY',
            discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
            // Scopes to request in addition to 'profile' and 'email'
            scope: 'https://www.googleapis.com/auth/cloud-translation',
          });
        });
      }
      function signInCallback(authResult) {
        if (authResult['code']) {
          console.log("sending AJAX request");
          // Send authorization code obtained from Google to backend platform
          $.ajax({
            type: 'POST',
            url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
            // Always include an X-Requested-With header to protect against CSRF attacks.
            headers: {
              'X-Requested-With': 'XMLHttpRequest'
            },
            contentType: 'application/octet-stream; charset=utf-8',
            success: function(result) {
              console.log(result);
            },
            processData: false,
            data: authResult['code']
          });
        } else {
          console.log('error: failed to obtain authorization code')
        }
      }
    </script>
  </head>
  <body>
    <button id="signinButton">Sign In With Google</button>
    <script>
      $('#signinButton').click(function() {
        // Obtain an authorization code from Google
        auth2.grantOfflineAccess().then(signInCallback);
      });
    </script>
  </body>
</html>

HTTP/REST রিডাইরেক্ট ব্যবহার করে

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

/\*
 \* Create form to request access token from Google's OAuth 2.0 server.
 \*/
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
  // Create &lt;form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);
  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client\_id': 'YOUR_CLIENT_ID',
                'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
                'response\_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                'include\_granted\_scopes': 'true',
                'state': 'pass-through value'};
  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

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

নতুন উপায়

জিআইএস পপআপ ইউএক্স

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

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly',
          ux_mode: 'popup',
          callback: (response) => {
            var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
            // Send auth code to your backend platform
            const xhr = new XMLHttpRequest();
            xhr.open('POST', code_receiver_uri, true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.onload = function() {
              console.log('Signed in as: ' + xhr.responseText);
            };
            xhr.send('code=' + response.code);
            // After receipt, the code is exchanged for an access token and
            // refresh token, and the platform then updates this web app
            // running in user's browser with the requested calendar info.
          },
        });
      }
      function getAuthCode() {
        // Request authorization code and obtain user consent
        client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

জিআইএস রিডাইরেক্ট ইউএক্স

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

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/photoslibrary.readonly',
          ux_mode: 'redirect',
          redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
        });
      }
      // Request an access token
      function getAuthCode() {
        // Request authorization code and obtain user consent
        client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

জাভাস্ক্রিপ্ট লাইব্রেরি

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

আইডেন্টিটি সার্ভিসে স্থানান্তরিত করার সময় করণীয় পদক্ষেপসমূহ:

বিদ্যমান JS লাইব্রেরি নতুন জেএস লাইব্রেরি নোট
apis.google.com/js/api.js accounts.google.com/gsi/client নতুন লাইব্রেরি যোগ করুন এবং অন্তর্নিহিত প্রবাহ অনুসরণ করুন।
apis.google.com/js/client.js accounts.google.com/gsi/client নতুন লাইব্রেরি এবং অনুমোদন কোড প্রবাহ যোগ করুন।

লাইব্রেরির দ্রুত রেফারেন্স

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

পুরানো নতুন নোট
GoogleAuth অবজেক্ট এবং এর সংশ্লিষ্ট মেথডসমূহ:
GoogleAuth.attachClickHandler() অপসারণ করুন
GoogleAuth.currentUser.get() অপসারণ করুন
GoogleAuth.currentUser.listen() অপসারণ করুন
GoogleAuth.disconnect() google.accounts.oauth2.revoke পুরানোটির পরিবর্তে নতুনটি প্রতিস্থাপন করুন। https://myaccount.google.com/permissions থেকেও প্রত্যাহার করা যেতে পারে।
GoogleAuth.grantOfflineAccess() অপসারণ করুন, অনুমোদন কোডের প্রবাহ অনুসরণ করুন।
GoogleAuth.isSignedIn.get() অপসারণ করুন
GoogleAuth.isSignedIn.listen() অপসারণ করুন
GoogleAuth.signIn() অপসারণ করুন
GoogleAuth.signOut() অপসারণ করুন
GoogleAuth.then() অপসারণ করুন
GoogleUser অবজেক্ট এবং এর সংশ্লিষ্ট মেথডসমূহ:
GoogleUser.disconnect() google.accounts.id.revoke পুরানোটির পরিবর্তে নতুনটি প্রতিস্থাপন করুন। https://myaccount.google.com/permissions থেকেও প্রত্যাহার করা যেতে পারে।
GoogleUser.getAuthResponse() requestCode() অথবা requestAccessToken() পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.getBasicProfile() মুছে ফেলুন। এর পরিবর্তে আইডি টোকেন ব্যবহার করুন, গুগল সাইন-ইন থেকে মাইগ্রেট করা দেখুন।
GoogleUser.getGrantedScopes() hasGrantedAnyScope() পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.getHostedDomain() অপসারণ করুন
GoogleUser.getId() অপসারণ করুন
GoogleUser.grantOfflineAccess() অপসারণ করুন, অনুমোদন কোডের প্রবাহ অনুসরণ করুন।
GoogleUser.grant() অপসারণ করুন
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.isSignedIn() অপসারণ করুন
GoogleUser.reloadAuthResponse() অ্যাক্সেস টোকেন অনুরোধ করুন() মেয়াদোত্তীর্ণ বা বাতিল করা অ্যাক্সেস টোকেন প্রতিস্থাপনের জন্য পুরানোটি সরিয়ে নতুনটি কল করুন।
gapi.auth2 অবজেক্ট এবং এর সাথে সম্পর্কিত মেথডসমূহ:
gapi.auth2.AuthorizeConfig অবজেক্ট টোকেনক্লায়েন্টকনফিগ অথবা কোডক্লায়েন্টকনফিগ পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.AuthorizeResponse অবজেক্ট অপসারণ করুন
gapi.auth2.AuthResponse অবজেক্ট অপসারণ করুন
gapi.auth2.authorize() requestCode() অথবা requestAccessToken() পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.ClientConfig() টোকেনক্লায়েন্টকনফিগ অথবা কোডক্লায়েন্টকনফিগ পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.getAuthInstance() অপসারণ করুন
gapi.auth2.init() initTokenClient() অথবা initCodeClient() পুরানোটি নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.OfflineAccessOptions অবজেক্ট অপসারণ করুন
gapi.auth2.SignInOptions অবজেক্ট অপসারণ করুন
gapi.signin2 অবজেক্ট এবং এর সাথে সম্পর্কিত মেথডসমূহ:
gapi.signin2.render() অপসারণ করুন। g_id_signin এলিমেন্টের HTML DOM লোডিং অথবা google.accounts.id.renderButton- এ JS কল ব্যবহারকারীকে একটি গুগল অ্যাকাউন্টে সাইন-ইন করতে ট্রিগার করে।

প্রমাণপত্রের উদাহরণ

বিদ্যমান প্রমাণপত্র

গুগল সাইন-ইন প্ল্যাটফর্ম লাইব্রেরি , জাভাস্ক্রিপ্টের জন্য গুগল এপিআই ক্লায়েন্ট লাইব্রেরি , অথবা গুগল OAuth 2.0 এন্ডপয়েন্টগুলিতে সরাসরি কল করলে একটিমাত্র রেসপন্সেই একটি OAuth 2.0 অ্যাক্সেস টোকেন এবং একটি OpenID Connect আইডি টোকেন উভয়ই ফেরত আসে।

access_token এবং id_token উভয়ই ধারণকারী প্রতিক্রিয়ার উদাহরণ:

  {
    "token_type": "Bearer",
    "access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
    "scope": "https://www.googleapis.com/auth/calendar.readonly",
    "login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
    "expires_in": 3599,
    "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
    "session_state": {
      "extraQueryParams": {
        "authuser": "0"
      }
    },
    "first_issued_at": 1638991637982,
    "expires_at": 1638995236982,
    "idpId": "google"
  }

গুগল আইডেন্টিটি সার্ভিসেস ক্রেডেনশিয়াল

গুগল আইডেন্টিটি সার্ভিসেস লাইব্রেরিটি ফেরত দেয়:

  • অনুমোদনের জন্য ব্যবহৃত হলে একটি অ্যাক্সেস টোকেন:

    {
      "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g",
      "token_type": "Bearer",
      "expires_in": 3599,
      "scope": "https://www.googleapis.com/auth/calendar.readonly"
    }
    
  • অথবা, প্রমাণীকরণের জন্য ব্যবহৃত হলে একটি আইডি টোকেন:

    {
      "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com",
      "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ",
      "select_by": "user"
    }
    

অবৈধ টোকেন প্রতিক্রিয়া

মেয়াদোত্তীর্ণ, বাতিল বা অবৈধ অ্যাক্সেস টোকেন ব্যবহার করে এপিআই (API) অনুরোধ করার চেষ্টা করলে গুগল থেকে প্রাপ্ত প্রতিক্রিয়ার একটি উদাহরণ:

HTTP প্রতিক্রিয়া হেডার

  www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"

প্রতিক্রিয়া সংস্থা

  {
    "error": {
      "code": 401,
      "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
      "errors": [
        {
          "message": "Invalid Credentials",
          "domain": "global",
          "reason": "authError",
          "location": "Authorization",
          "locationType": "header"
        }
      ],
      "status": "UNAUTHENTICATED"
    }
  }