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

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

ওভারভিউ

Google APIs কল করার জন্য প্রতি ব্যবহারকারী অ্যাক্সেস টোকেন পেতে, Google একাধিক জাভাস্ক্রিপ্ট লাইব্রেরি অফার করে:

এই নির্দেশিকাটি এই লাইব্রেরিগুলি থেকে Google আইডেন্টিটি সার্ভিসেস লাইব্রেরিতে স্থানান্তরিত করার নির্দেশনা প্রদান করে৷

এই নির্দেশিকা অনুসরণ করে, আপনি হবে:

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

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

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

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

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

বর্তমানে ব্যবহার করা অনুমোদন প্রবাহের ধরন সনাক্ত করতে আপনার ওয়েব অ্যাপ পর্যালোচনা করুন৷

ইঙ্গিত আপনার ওয়েব অ্যাপ অন্তর্নিহিত প্রবাহ ব্যবহার করছে:

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

ইঙ্গিত আপনার ওয়েব অ্যাপ অনুমোদন কোড প্রবাহ ব্যবহার করছে:

  • আপনার বাস্তবায়নের উপর ভিত্তি করে:

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

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

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

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

কিছু ক্ষেত্রে, আপনার কোডবেস উভয় প্রবাহ সমর্থন করতে পারে।

একটি অনুমোদন প্রবাহ চয়ন করুন

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

দুটি প্রবাহের মধ্যে মূল পার্থক্য এবং ট্রেডঅফ বোঝার জন্য একটি অনুমোদনের প্রবাহ বেছে নেওয়ার পর্যালোচনা করুন।

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

নীচের নির্বাচকদের ব্যবহার করে একটি অনুমোদন প্রবাহ চয়ন করুন

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

ব্যবহারকারী উপস্থিত থাকাকালীন ইন-ব্রাউজার ব্যবহারের জন্য একটি অ্যাক্সেস টোকেন পান।

অন্তর্নিহিত প্রবাহের উদাহরণগুলি পরিচয় পরিষেবাগুলিতে স্থানান্তরের আগে এবং পরে ওয়েব অ্যাপগুলি দেখায়৷

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

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

অনুমোদন কোড প্রবাহের উদাহরণগুলি পরিচয় পরিষেবাগুলিতে মাইগ্রেশনের আগে এবং পরে ওয়েব অ্যাপগুলি দেখায়৷

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

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

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

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

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

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

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

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

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

ব্যবহারকারীর প্রভাব কমানোর জন্য এটি সুপারিশ করা হয় যে আপনি প্রথমে এই কুকিটি উত্পাদন পরিবেশে ব্যবহার করার আগে বিকাশ এবং পরীক্ষার সময় স্থানীয়ভাবে সেট করুন৷

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

gapi.auth2 মডিউলটি সাইন-ইন করার জন্য ব্যবহারকারীর প্রমাণীকরণ এবং অনুমোদনের জন্য অন্তর্নিহিত প্রবাহ পরিচালনা করে, এই অবমূল্যায়িত মডিউলটি এবং এর অবজেক্ট এবং পদ্ধতিগুলিকে Google পরিচয় পরিষেবা লাইব্রেরির সাথে প্রতিস্থাপন করে৷

আপনার নথিতে এটি অন্তর্ভুক্ত করে আপনার ওয়েব অ্যাপে পরিচয় পরিষেবা লাইব্রেরি যোগ করুন:

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

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

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

কুকিজ

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

কীভাবে ব্যবহারকারী প্রমাণীকরণ কুকিজ ব্যবহার করে, এবং অন্যান্য Google পণ্য এবং পরিষেবাগুলির দ্বারা কুকি ব্যবহারের জন্য Google কীভাবে কুকি ব্যবহার করে তার বিশদ বিবরণের জন্য Google সাইন-ইন থেকে স্থানান্তর করা দেখুন৷

শংসাপত্র

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

এই পরিবর্তনগুলি দেখতে, উদাহরণ শংসাপত্র দেখুন।

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

অনুমোদন প্রবাহ থেকে ব্যবহারকারীর প্রোফাইল হ্যান্ডলিং অপসারণ করে পৃথক ব্যবহারকারী প্রমাণীকরণ এবং অনুমোদন।

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

পদ্ধতি

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

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

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

অধিবেশন অবস্থা

পূর্বে, Google সাইন-ইন আপনাকে ব্যবহার করে ব্যবহারকারীর সাইন-ইন অবস্থা পরিচালনা করতে সাহায্য করেছিল:

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

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

বস্তু:

  • 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()

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

অন্তর্নিহিত বা অনুমোদন কোড প্রবাহের জন্য একটি টোকেন ক্লায়েন্ট শুরু করতে আপনার ওয়েব অ্যাপ আপডেট করুন।

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

বস্তু:

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

পদ্ধতি:

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

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

একটি TokenClientConfig অবজেক্ট যোগ করুন এবং আপনার ওয়েব অ্যাপ কনফিগার করতে initTokenClient() কল করুন, একটি টোকেন ক্লায়েন্ট আরম্ভ করার উদাহরণ অনুসরণ করুন।

Google আইডেন্টিটি সার্ভিসের সাথে Google সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্স প্রতিস্থাপন করুন:

বস্তু:

  • gapi.auth2.AuthorizeConfig সাথে TokenClientConfig

পদ্ধতি:

  • google.accounts.oauth2.initTokenClient() gapi.auth2.init() )

পরামিতি:

  • gapi.auth2.AuthorizeConfig.login_hint TokenClientConfig.hint
  • gapi.auth2.GoogleUser.getHostedDomain() TokenClientConfig.hosted_domain সাথে।

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

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

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

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

বস্তু:

  • gapi.auth2.AuthorizeConfig

পদ্ধতি:

  • gapi.auth2.init()

পরামিতি:

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

টোকেন অনুরোধ

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

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

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

Google সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্স প্রতিস্থাপন করুন: Google পরিচয় পরিষেবাগুলির সাথে:

পদ্ধতি:

  • gapi.auth2.authorize() এর সাথে TokenClient.requestAccessToken()
  • GoogleUser.reloadAuthResponse() সহ TokenClient.requestAccessToken()

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

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

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

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

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

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

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

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

টোকেন হ্যান্ডলিং

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

একটি HTTP স্ট্যাটাস কোড 401 Unauthorized এবং invalid_token ত্রুটি বার্তা Google API দ্বারা ফেরত দেওয়া হয় যখন একটি মেয়াদ উত্তীর্ণ বা প্রত্যাহার করা অ্যাক্সেস টোকেন ব্যবহার করা হয়। একটি উদাহরণের জন্য, অবৈধ টোকেন প্রতিক্রিয়া দেখুন।

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

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

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

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

Google সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্স প্রতিস্থাপন করুন: Google পরিচয় পরিষেবাগুলির সাথে:

পদ্ধতি:

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

যখন কোনও ব্যবহারকারী আপনার প্ল্যাটফর্মে তাদের অ্যাকাউন্ট মুছে ফেলে বা আপনার অ্যাপের সাথে ডেটা ভাগ করার জন্য সম্মতি সরাতে চান তখন কল revoke করুন।

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

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

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

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

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

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

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

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

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

Google আইডেন্টিটি সার্ভিসের সাথে Google সাইন-ইন জাভাস্ক্রিপ্ট ক্লায়েন্ট রেফারেন্স প্রতিস্থাপন করুন:

বস্তু:

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

পদ্ধতি:

  • google.accounts.oauth2.hasGrantedAllScopes() GoogleUser.hasGrantedScopes() )
  • google.accounts.oauth2.hasGrantedAllScopes() GoogleUser.getGrantedScopes() )

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

পদ্ধতি:

  • GoogleUser.getAuthResponse()

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

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

অনুমোদন কোড পরিচালনার নির্দেশাবলী অনুসরণ করে আপনার ব্যাকএন্ড প্ল্যাটফর্মে একটি অনুমোদন কোড এন্ডপয়েন্ট আপডেট করুন বা যোগ করুন

অনুরোধটি যাচাই করতে এবং একটি অ্যাক্সেস টোকেন এবং রিফ্রেশ টোকেন পেতে কোড মডেল নির্দেশিকাতে বর্ণিত পদক্ষেপগুলি অনুসরণ করতে আপনার প্ল্যাটফর্ম আপডেট করুন৷

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

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

পুরানো উপায়

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

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

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 API 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 এন্ডপয়েন্ট

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

এই উদাহরণটি ব্যবহারকারীর ব্রাউজার থেকে Google এর 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>

নতুন উপায়

শুধুমাত্র GIS

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

<!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 অ্যাসিঙ্ক/অপেক্ষা

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

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

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

<!DOCTYPE html>
<html>
<head></head>
<body>
  <h1>GAPI with GIS async/await</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>

  <script>

    const gapiLoadPromise = new Promise((resolve, reject) => {
      gapiLoadOkay = resolve;
      gapiLoadFail = reject;
    });
    const gisLoadPromise = new Promise((resolve, reject) => {
      gisLoadOkay = resolve;
      gisLoadFail = reject;
    });

    var tokenClient;

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

      // First, load and initialize the gapi.client
      await gapiLoadPromise;
      await new Promise((resolve, reject) => {
        // NOTE: the 'auth2' module is no longer loaded.
        gapi.load('client', {callback: resolve, onerror: reject});
      });
      await 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');
      });

      // Now load the GIS client
      await gisLoadPromise;
      await new Promise((resolve, reject) => {
        try {
          tokenClient = google.accounts.oauth2.initTokenClient({
              client_id: 'YOUR_CLIENT_ID',
              scope: 'https://www.googleapis.com/auth/calendar.readonly',
              prompt: 'consent',
              callback: '',  // defined at request time in await/promise scope.
          });
          resolve();
        } catch (err) {
          reject(err);
        }
      });

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

    async function getToken(err) {

      if (err.result.error.code == 401 || (err.result.error.code == 403) &&
          (err.result.error.status == "PERMISSION_DENIED")) {

        // The access token is missing, invalid, or expired, prompt for user consent to obtain one.
        await new Promise((resolve, reject) => {
          try {
            // Settle this promise in the response callback for requestAccessToken()
            tokenClient.callback = (resp) => {
              if (resp.error !== undefined) {
                reject(resp);
              }
              // GIS has automatically updated gapi.client with the newly issued access token.
              console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
              resolve(resp);
            };
            tokenClient.requestAccessToken();
          } catch (err) {
            console.log(err)
          }
        });
      } else {
        // Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
        throw new Error(err);
      }
    }

    function showEvents() {

      // Try to fetch a list of Calendar events. If a valid access token is needed,
      // prompt to obtain one and then retry the original request.
      gapi.client.calendar.events.list({ 'calendarId': 'primary' })
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => getToken(err))  // for authorization errors obtain an access token
      .then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => console.log(err));   // cancelled by user, timeout, etc.
    }

    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('');
      }
    }

  </script>

  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>

</body>
</html>

GAPI কলব্যাক

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

লাইব্রেরি লোডিং অর্ডার প্রয়োগ করতে ভেরিয়েবল ব্যবহার করা হয়। একটি বৈধ অ্যাক্সেস টোকেন ফেরত দেওয়ার পরে 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 an 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>

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

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

পুরানো উপায়

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

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

<!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 ব্যবহার করে ৷ ব্যবহারকারীর ব্রাউজারকে Google-এ রিডাইরেক্ট করার মাধ্যমে ব্যবহারকারীর সম্মতি নেওয়া হয়।

/\*
 \* 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();
}

নতুন উপায়

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

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

<!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=' + 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>

GIS পুনঃনির্দেশ UX

অনুমোদন কোড মডেল পপআপ সমর্থন করে এবং আপনার প্ল্যাটফর্ম দ্বারা হোস্ট করা এন্ডপয়েন্টে প্রতি ব্যবহারকারী অনুমোদন কোড পাঠাতে UX মোডগুলিকে পুনর্নির্দেশ করে৷ রিডাইরেক্ট UX মোড এখানে দেখানো হয়েছে:

<!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>

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

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

আইডেন্টিটি সার্ভিসে মাইগ্রেট করার সময় যে পদক্ষেপ নিতে হবে:

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

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

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

পুরাতন নতুন মন্তব্য
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. তারপর() অপসারণ
GoogleUser অবজেক্ট এবং সংশ্লিষ্ট পদ্ধতি:
GoogleUser.disconnect() google.accounts.id.revoke পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন। https://myaccount.google.com/permissions থেকেও প্রত্যাহার হতে পারে
GoogleUser.getAuthResponse() requestCode() বা requestAccessToken() পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.getBasicProfile() অপসারণ. পরিবর্তে আইডি টোকেন ব্যবহার করুন, Google সাইন-ইন থেকে মাইগ্রেশন দেখুন।
GoogleUser.getGrantedScopes() has GrantedAnyScope() পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.getHostedDomain() অপসারণ
GoogleUser.getId() অপসারণ
GoogleUser.grantOfflineAccess() সরান, অনুমোদন কোড প্রবাহ অনুসরণ করুন.
GoogleUser.grant() অপসারণ
GoogleUser.hasGrantedScopes() has GrantedAnyScope() পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
GoogleUser.isSignedIn() অপসারণ
GoogleUser.reloadAuthResponse() requestAccessToken() পুরানো সরান, মেয়াদ উত্তীর্ণ বা প্রত্যাহার করা অ্যাক্সেস টোকেন প্রতিস্থাপন করতে নতুন কল করুন।
gapi.auth2 অবজেক্ট এবং সংশ্লিষ্ট পদ্ধতি:
gapi.auth2.AuthorizeConfig অবজেক্ট TokenClientConfig বা CodeClientConfig পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.AuthorizeResponse অবজেক্ট অপসারণ
gapi.auth2.AuthResponse অবজেক্ট অপসারণ
gapi.auth2.authorize() requestCode() বা requestAccessToken() পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
gapi.auth2.ClientConfig() TokenClientConfig বা CodeClientConfig পুরাতনকে নতুন দিয়ে প্রতিস্থাপন করুন
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 কল একটি Google অ্যাকাউন্টে ব্যবহারকারীর সাইন-ইনকে ট্রিগার করে৷

উদাহরণ শংসাপত্র

বিদ্যমান শংসাপত্র

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

অ্যাক্সেস_টোকেন এবং 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"
  }

Google পরিচয় পরিষেবার শংসাপত্র

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 অনুরোধ করার চেষ্টা করার সময় Google থেকে উদাহরণের প্রতিক্রিয়া:

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"
    }
  }