به Google Identity Services مهاجرت کنید

نمای کلی

برای به دست آوردن رمز دسترسی به ازای هر کاربر برای تماس با Google API، Google چندین کتابخانه جاوا اسکریپت را ارائه می دهد:

این راهنما دستورالعمل‌هایی را برای انتقال از این کتابخانه‌ها به کتابخانه Google Identity Services ارائه می‌کند.

با پیروی از این راهنما، شما:

  • کتابخانه پلتفرم منسوخ شده را با کتابخانه خدمات هویت جایگزین کنید، و
  • اگر از کتابخانه سرویس گیرنده API استفاده می کنید، ماژول منسوخ gapi.auth2 ، روش ها و اشیاء آن را حذف کنید و آن ها را با خدمات مشابه Identity Services جایگزین کنید.

برای توضیح آنچه که با کتابخانه جاوا اسکریپت خدمات هویت تغییر کرده است، مرور کلی و نحوه عملکرد مجوز کاربر برای بررسی اصطلاحات و مفاهیم کلیدی را بخوانید.

اگر به‌دنبال احراز هویت برای ثبت‌نام و ورود کاربر هستید، به جای آن ، مهاجرت از Google Sign-In را ببینید.

جریان مجوز خود را شناسایی کنید

دو جریان مجوز کاربر وجود دارد: ضمنی و کد مجوز.

برای شناسایی نوع جریان مجوزی که در حال حاضر استفاده می شود، برنامه وب خود را مرور کنید .

نشانه هایی که برنامه وب شما از جریان ضمنی استفاده می کند:

  • برنامه وب شما صرفاً مبتنی بر مرورگر است، بدون پلتفرم باطنی.
  • کاربر برای تماس با Google API باید حضور داشته باشد، برنامه شما فقط از نشانه‌های دسترسی استفاده می‌کند و به نشانه‌های تازه‌سازی نیاز ندارد.
  • برنامه وب شما apis.google.com/js/api.js را بارگیری می کند.
  • پیاده سازی شما بر اساس OAuth 2.0 برای برنامه های کاربردی وب سمت مشتری است.
  • برنامه شما از ماژول‌های gapi.client یا gapi.auth2 موجود در Google API Client Library برای جاوا اسکریپت استفاده می‌کند.

نشانه هایی که برنامه وب شما از جریان کد مجوز استفاده می کند:

  • پیاده سازی شما بر اساس موارد زیر است:

  • برنامه شما هم در مرورگر کاربر و هم در پلتفرم باطن شما اجرا می شود.

  • پلتفرم باطن شما میزبان یک نقطه پایانی کد مجوز است.

  • پلتفرم باطن شما APIهای Google را از طرف کاربران بدون نیاز به حضور آنها فراخوانی می‌کند که به عنوان حالت آفلاین نیز شناخته می‌شود.

  • توکن‌های Refresh توسط پلتفرم باطن شما مدیریت و ذخیره می‌شوند.

در برخی موارد، پایگاه کد شما ممکن است از هر دو جریان پشتیبانی کند.

یک جریان مجوز را انتخاب کنید

قبل از شروع مهاجرت، باید تعیین کنید که آیا ادامه جریان فعلی خود یا اتخاذ یک جریان متفاوت به بهترین وجه نیازهای شما را برآورده می کند.

برای درک تفاوت‌های کلیدی و مبادلات بین این دو جریان، انتخاب یک جریان مجوز را بررسی کنید.

در بیشتر موارد، جریان کد مجوز توصیه می شود زیرا بالاترین سطح امنیت کاربر را ارائه می دهد. پیاده‌سازی این جریان همچنین پلتفرم شما را قادر می‌سازد تا به راحتی قابلیت‌های آفلاین جدیدی مانند واکشی به‌روزرسانی‌ها را اضافه کند تا کاربران را از تغییرات قابل توجه در تقویم، عکس‌ها، اشتراک‌ها و غیره مطلع کند.

یک جریان مجوز را با استفاده از انتخابگرهای زیر انتخاب کنید .

جریان ضمنی

در زمانی که کاربر حضور دارد، یک نشانه دسترسی برای استفاده در مرورگر دریافت کنید.

مثال‌های جریان ضمنی، برنامه‌های وب را قبل و بعد از انتقال به سرویس‌های هویت نشان می‌دهند.

جریان کد مجوز

یک کد مجوز به ازای هر کاربر صادر شده توسط Google به پلتفرم باطن شما تحویل داده می‌شود، جایی که با یک نشانه دسترسی و رمز بازخوانی مبادله می‌شود.

نمونه‌های جریان کد مجوز ، برنامه‌های وب را قبل و بعد از انتقال به سرویس‌های هویت نشان می‌دهد.

در سراسر این راهنما، دستورالعمل‌های فهرست‌شده با پررنگ را دنبال کنید تا عملکردهای موجود را اضافه کنید ، حذف کنید ، به‌روزرسانی کنید یا جایگزین کنید .

تغییرات در برنامه وب درون مرورگر شما

این بخش تغییراتی را که هنگام مهاجرت به کتابخانه جاوا اسکریپت سرویس های هویت گوگل در برنامه وب درون مرورگر خود ایجاد می کنید، مرور می کند.

شناسایی کد آسیب دیده و آزمایش

یک کوکی اشکال‌زدایی می‌تواند به یافتن کد آسیب‌دیده و آزمایش رفتار پس از منسوخ شدن کمک کند.

در برنامه‌های بزرگ یا پیچیده، یافتن همه کدهایی که تحت تأثیر منسوخ شدن ماژول gapi.auth2 قرار گرفته‌اند، ممکن است دشوار باشد. برای ثبت استفاده موجود از عملکردهای به زودی منسوخ شده در کنسول، مقدار کوکی G_AUTH2_MIGRATION را روی informational تنظیم کنید. در صورت تمایل، یک دونقطه و به دنبال آن یک مقدار کلید اضافه کنید تا همچنین وارد فضای ذخیره‌سازی جلسه شوید. پس از ورود به سیستم و دریافت اعتبارنامه ها را بررسی کنید یا گزارش های جمع آوری شده را برای تجزیه و تحلیل بعدی به یک باطن ارسال کنید. به عنوان مثال، informational:showauth2use مبدا و URL را در یک کلید ذخیره سازی جلسه به نام showauth2use ذخیره می کند.

برای تأیید رفتار برنامه زمانی که ماژول gapi.auth2 دیگر بارگیری نمی شود، مقدار کوکی G_AUTH2_MIGRATION را روی enforced تنظیم کنید. این امکان آزمایش رفتار پس از انکار را قبل از تاریخ اجرا فراهم می کند.

مقادیر احتمالی کوکی G_AUTH2_MIGRATION :

  • enforced ماژول gapi.auth2 بارگیری نکنید.
  • گزارش informational استفاده از عملکرد منسوخ شده در کنسول JS. همچنین هنگامی که یک نام کلید اختیاری تنظیم شده است، به ذخیره سازی جلسه وارد شوید: informational:key-name .

برای به حداقل رساندن تأثیر کاربر، توصیه می شود که ابتدا این کوکی را در حین توسعه و آزمایش، قبل از استفاده در محیط های تولید، به صورت محلی تنظیم کنید.

کتابخانه ها و ماژول ها

ماژول gapi.auth2 احراز هویت کاربر را برای ورود به سیستم و جریان ضمنی مجوز را مدیریت می‌کند، این ماژول منسوخ شده و اشیاء و روش‌های آن را با کتابخانه Google Identity Services جایگزین می‌کند.

کتابخانه خدمات هویت را با قرار دادن آن در سند خود به برنامه وب خود اضافه کنید :

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

هر گونه نمونه بارگیری ماژول auth2 را با استفاده از gapi.load('auth2', function) حذف کنید .

کتابخانه Google Identity Services جایگزین استفاده از ماژول gapi.auth2 می شود. می‌توانید با خیال راحت به استفاده از ماژول gapi.client از Google API Client Library برای جاوا اسکریپت ادامه دهید و از ایجاد خودکار روش‌های JS قابل فراخوانی از یک سند اکتشافی، جمع‌بندی چند تماس API و عملکرد مدیریت CORS بهره ببرید.

کوکی ها

مجوز کاربر نیازی به استفاده از کوکی ها ندارد.

برای جزئیات نحوه استفاده احراز هویت کاربر از کوکی‌ها و نحوه استفاده Google از کوکی‌ها برای استفاده از کوکی توسط سایر محصولات و خدمات Google، به مهاجرت از ورود به سیستم Google مراجعه کنید.

اعتبارنامه

Google Identity Services احراز هویت و مجوز کاربر را به دو عملیات مجزا تفکیک می‌کند و اعتبار کاربر مجزا است: کد شناسه مورد استفاده برای شناسایی کاربر جدا از نشانه دسترسی استفاده شده برای مجوز بازگردانده می‌شود.

برای مشاهده این تغییرات، به نمونه اعتبارنامه مراجعه کنید.

جریان ضمنی

با حذف مدیریت پروفایل کاربر از جریان مجوز، احراز هویت و مجوز کاربر را جدا کنید.

این ارجاعات سرویس گیرنده جاوا اسکریپت Google Sign-In را حذف کنید :

روش ها

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

جریان کد مجوز

Identity Services اعتبارنامه های درون مرورگر را به شناسه شناسه و توکن دسترسی جدا می کند. این تغییر برای اعتبارنامه‌هایی که از طریق تماس مستقیم با نقاط پایانی Google OAuth 2.0 از پلتفرم باطن شما یا از طریق کتابخانه‌هایی که روی یک سرور امن در پلتفرم شما اجرا می‌شوند، مانند Google APIs Node.js Client اعمال نمی‌شود.

وضعیت جلسه

قبلاً، Google Sign-In به شما کمک می‌کرد تا وضعیت ورود کاربر به سیستم را با استفاده از:

شما مسئول مدیریت وضعیت ورود به سیستم و جلسات کاربر در برنامه وب خود هستید.

این ارجاعات سرویس گیرنده جاوا اسکریپت Google Sign-In را حذف کنید :

اشیاء:

  • 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 Sign-In را حذف کنید :

اشیاء:

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

روش ها:

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

جریان ضمنی

یک شی TokenClientConfig اضافه کنید و initTokenClient() برای پیکربندی برنامه وب خود، به دنبال مثال در مقداردهی اولیه یک کلاینت توکن، فراخوانی کنید.

به جای ارجاعات سرویس گیرنده جاوا اسکریپت Google Sign-In Google Identity Services :

اشیاء:

  • gapi.auth2.AuthorizeConfig با TokenClientConfig

روش ها:

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

پارامترها:

  • gapi.auth2.AuthorizeConfig.login_hint با TokenClientConfig.login_hint .
  • gapi.auth2.GoogleUser.getHostedDomain() با TokenClientConfig.hd .

جریان کد مجوز

یک شی CodeClientConfig اضافه کنید و initCodeClient() برای پیکربندی برنامه وب خود، به دنبال مثال در مقداردهی اولیه یک Code Client، فراخوانی کنید.

هنگام تغییر از جریان کد ضمنی به مجوز:

ارجاعات سرویس گیرنده جاوا اسکریپت Google Sign-In را حذف کنید

اشیاء:

  • gapi.auth2.AuthorizeConfig

روش ها:

  • gapi.auth2.init()

پارامترها:

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

درخواست توکن

یک حرکت کاربر، مانند کلیک روی دکمه، درخواستی را ایجاد می‌کند که منجر به بازگردانی یک نشانه دسترسی مستقیم به مرورگر کاربر با جریان ضمنی یا به پلتفرم پشتیبان شما پس از مبادله یک کد مجوز برای هر کاربر برای یک نشانه دسترسی و نشانه تازه‌سازی می‌شود. .

جریان ضمنی

در زمانی که کاربر وارد سیستم شده است و یک جلسه فعال با Google دارد، نشانه های دسترسی ممکن است در مرورگر دریافت و استفاده شوند. برای حالت ضمنی، یک اشاره کاربر برای درخواست یک نشانه دسترسی لازم است، حتی اگر درخواست قبلی وجود داشته باشد.

جایگزینی مراجع جاوا اسکریپت ورود به سیستم Google : با خدمات هویت گوگل :

روش ها:

  • gapi.auth2.authorize() با TokenClient.requestAccessToken()
  • GoogleUser.reloadAuthResponse() با TokenClient.requestAccessToken()

یک پیوند یا دکمه برای فراخوانی requestAccessToken() اضافه کنید تا جریان UX پاپ آپ را برای درخواست یک نشانه دسترسی شروع کنید، یا زمانی که توکن موجود منقضی شود، یک توکن جدید به دست آورید.

پایگاه کد خود را به روز کنید :

  • جریان توکن OAuth 2.0 را با requestAccessToken() فعال کنید.
  • از مجوز افزایشی با استفاده از requestAccessToken و OverridableTokenClientConfig پشتیبانی کنید تا یک درخواست برای دامنه های مختلف را به چندین درخواست کوچکتر جدا کنید.
  • زمانی که توکن موجود منقضی شد، یا باطل شد، یک توکن جدید درخواست کنید.

کار با چندین دامنه ممکن است نیاز به تغییرات ساختاری در پایگاه کد شما داشته باشد تا درخواست دسترسی به دامنه‌ها فقط در صورت نیاز باشد و نه یکباره، این به عنوان مجوز افزایشی شناخته می‌شود. هر درخواست باید تا حد امکان دارای محدوده‌های کمتری باشد و در حالت ایده‌آل یک محدوده واحد باشد. برای اطلاعات بیشتر در مورد نحوه به‌روزرسانی برنامه برای مجوز افزایشی، نحوه رسیدگی به رضایت کاربر را ببینید.

هنگامی که یک نشانه دسترسی منقضی می شود، ماژول gapi.auth2 به طور خودکار یک نشانه دسترسی جدید و معتبر برای برنامه وب شما دریافت می کند. برای بهبود امنیت کاربر، این فرآیند به‌روزرسانی خودکار رمز توسط کتابخانه خدمات هویت Google پشتیبانی نمی‌شود. برنامه وب شما باید به روز شود تا رمز دسترسی منقضی شده را شناسایی کند و یک نشانه جدید درخواست کند. برای اطلاعات بیشتر به بخش مدیریت توکن در زیر مراجعه کنید.

جریان کد مجوز

برای درخواست کد مجوز از Google، پیوند یا دکمه ای برای فراخوانی requestCode() اضافه کنید. برای مثال، به Trigger OAuth 2.0 Code Flow مراجعه کنید.

برای اطلاعات بیشتر در مورد نحوه پاسخگویی به یک نشانه دسترسی منقضی یا لغو شده، به بخش مدیریت توکن در زیر مراجعه کنید.

مدیریت توکن

مدیریت خطا را برای شناسایی تماس‌های ناموفق Google API هنگام استفاده از نشانه دسترسی منقضی یا لغو شده و درخواست یک نشانه دسترسی جدید و معتبر اضافه کنید .

یک کد وضعیت HTTP از پیام خطای 401 Unauthorized and invalid_token توسط Google API زمانی که از یک نشانه دسترسی منقضی شده یا لغو شده استفاده می شود، بازگردانده می شود. برای مثال، پاسخ نشانه نامعتبر را ببینید.

توکن های منقضی شده

توکن های دسترسی کوتاه مدت هستند و اغلب فقط برای چند دقیقه معتبر هستند.

ابطال توکن

در هر زمانی، مالک حساب Google ممکن است رضایت قبلی را لغو کند. انجام این کار نشانه های دسترسی موجود را باطل می کند و توکن ها را تازه می کند. ابطال ممکن است از پلتفرم شما با استفاده از revoke() یا از طریق یک حساب Google آغاز شود.

جایگزینی مراجع جاوا اسکریپت ورود به سیستم Google : با خدمات هویت گوگل :

روش ها:

  • getAuthInstance().disconnect() با google.accounts.oauth2.revoke()
  • GoogleUser.disconnect() با google.accounts.oauth2.revoke()

هنگامی که کاربری حساب خود را در پلتفرم شما حذف می‌کند یا می‌خواهد رضایت خود را برای اشتراک‌گذاری داده‌ها با برنامه شما حذف کند، تماس revoke .

هنگامی که برنامه وب یا پلتفرم پشتیبان شما یک نشانه دسترسی درخواست می کند، Google یک گفتگوی رضایت را برای کاربر نمایش می دهد. مشاهده نمونه گفتگوهای رضایت که توسط Google به کاربران نمایش داده می شود.

قبل از صدور رمز دسترسی به برنامه شما، یک جلسه Google موجود و فعال برای درخواست رضایت کاربر و ثبت نتیجه لازم است. اگر جلسه موجود قبلاً ایجاد نشده باشد، ممکن است از کاربر خواسته شود که به یک حساب Google وارد شود.

ورود کاربر

کاربران ممکن است در یک برگه مرورگر جداگانه یا به صورت بومی از طریق یک مرورگر یا سیستم عامل وارد حساب Google شوند. توصیه می‌کنیم ورود با Google را به سایت خود اضافه کنید تا زمانی که کاربر برای اولین بار برنامه شما را باز می‌کند، یک جلسه فعال بین حساب Google و مرورگر برقرار شود. انجام این کار این مزایا را به همراه دارد:

  • تعداد دفعاتی که کاربر باید وارد سیستم شود را به حداقل می‌رساند، در صورتی که جلسه فعالی از قبل وجود نداشته باشد، درخواست یک نشانه دسترسی، فرآیند ورود به حساب Google را آغاز می‌کند.
  • مستقیماً از فیلد email اعتبار JWT ID Token به عنوان مقدار پارامتر login_hint در اشیاء CodeClientConfig یا TokenClientConfig استفاده کنید. این به ویژه در صورتی مفید است که پلتفرم شما از سیستم مدیریت حساب کاربری استفاده نکند.
  • جستجو و مرتبط کردن یک حساب Google با یک حساب کاربری محلی موجود در پلتفرم خود، به حداقل رساندن حساب های تکراری در پلت فرم شما کمک می کند.
  • وقتی یک حساب محلی جدید ایجاد می‌شود، دیالوگ‌ها و جریان ثبت‌نام شما را می‌توان به وضوح از گفتگوها و جریان‌های احراز هویت کاربر جدا کرد، که تعداد مراحل مورد نیاز را کاهش می‌دهد و نرخ حذف را بهبود می‌بخشد.

پس از ورود به سیستم، و قبل از صدور یک نشانه دسترسی، کاربران باید رضایت درخواست شما را برای محدوده های درخواستی ارائه دهند.

پس از رضایت، یک نشانه دسترسی به همراه فهرستی از محدوده های تایید شده یا رد شده توسط کاربر بازگردانده می شود.

مجوزهای گرانول به کاربران اجازه می دهد تا محدوده های فردی را تأیید یا رد کنند. هنگام درخواست دسترسی به چندین دامنه، هر دامنه مستقل از دامنه های دیگر اعطا یا رد می شود. بر اساس انتخاب کاربر، برنامه شما به طور انتخابی ویژگی ها و عملکردهایی را فعال می کند که به محدوده فردی بستگی دارد.

جریان ضمنی

به جای ارجاعات سرویس گیرنده جاوا اسکریپت Google Sign-In Google Identity Services :

اشیاء:

  • gapi.auth2.AuthorizeResponse با TokenClient.TokenResponse
  • gapi.auth2.AuthResponse با TokenClient.TokenResponse

روش ها:

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

حذف مراجع سرویس گیرنده جاوا اسکریپت Google Sign-In :

روش ها:

  • GoogleUser.getAuthResponse()

برنامه وب خود را با hasGrantedAllScopes() و hasGrantedAnyScope() با دنبال کردن این مثال مجوزهای گرانول به روز کنید .

جریان کد مجوز

با پیروی از دستورالعمل‌های مربوط به مدیریت کد اعتبار ، یک نقطه پایانی کد مجوز را به پلتفرم پشتیبان خود به‌روزرسانی یا اضافه کنید .

پلتفرم خود را به‌روزرسانی کنید تا مراحل شرح داده شده در راهنمای استفاده از مدل کد را دنبال کنید تا درخواست را تأیید کنید و یک نشانه دسترسی و رمز بازخوانی دریافت کنید.

پلت فرم خود را برای فعال یا غیرفعال کردن انتخابی ویژگی‌ها و عملکردها بر اساس حوزه‌های فردی که کاربر تأیید کرده است، با پیروی از دستورالعمل‌های مجوز افزایشی و بررسی دامنه‌های دسترسی اعطا شده توسط کاربر، به‌روزرسانی کنید .

مثال های جریان ضمنی

روش قدیمی

کتابخانه مشتری GAPI

نمونه ای از Google API Client Library برای جاوا اسکریپت که در مرورگر با استفاده از یک گفتگوی بازشو برای رضایت کاربر اجرا می شود.

ماژول 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>

کتابخانه مشتری JS

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

OAuth 2.0 برای برنامه های کاربردی وب سمت سرویس گیرنده که در مرورگر با استفاده از تغییر مسیرها به Google برای رضایت کاربر اجرا می شوند.

این مثال تماس‌های مستقیم با نقاط پایانی OAuth 2.0 Google را از مرورگر کاربر نشان می‌دهد و از ماژول 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

این مثال فقط کتابخانه جاوا اسکریپت سرویس هویت گوگل را با استفاده از مدل نشانه و پنجره بازشو برای رضایت کاربر نشان می دهد. این برای نشان دادن حداقل تعداد مراحل مورد نیاز برای پیکربندی یک کلاینت، درخواست و دریافت نشانه دسترسی و فراخوانی یک API Google ارائه شده است.

<!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 حذف کرد و با استفاده از Google API Client Library برای جاوا اسکریپت، یک API فراخوانی کرد.

Promises، 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 حذف کرد و با استفاده از Google API Client Library برای جاوا اسکریپت، یک 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 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 پاپ‌آپ کتابخانه سرویس هویت Google می‌تواند از تغییر مسیر URL برای بازگرداندن کد مجوز مستقیماً به نقطه پایانی رمز پشتیبان شما استفاده کند یا از یک کنترل‌کننده پاسخ تماس جاوا اسکریپت که در مرورگر کاربر اجرا می‌شود و پاسخ را به پلتفرم شما پراکسی می‌کند. در هر صورت، پلتفرم باطن شما جریان 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();
}

راه جدید

GIS Popup UX

این مثال فقط کتابخانه جاوا اسکریپت سرویس هویت 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=' + 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>

GIS Redirect 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 Identity Services یک کتابخانه جاوا اسکریپت واحد است که برای احراز هویت و مجوز کاربر استفاده می‌شود که ویژگی‌ها و عملکردهای موجود در چندین کتابخانه و ماژول مختلف را ادغام و جایگزین می‌کند:

اقداماتی که باید هنگام مهاجرت به خدمات هویت انجام دهید:

کتابخانه JS موجود کتابخانه جدید JS یادداشت ها
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.then() حذف کنید
شیء GoogleUser و روشهای مرتبط:
GoogleUser.disconnect() google.accounts.id.revoke قدیمی را با جدید جایگزین کنید. لغو ممکن است از https://myaccount.google.com/permissions نیز انجام شود
GoogleUser.getAuthResponse() requestCode() یا requestAccessToken() قدیمی را با جدید جایگزین کنید
GoogleUser.getBasicProfile() حذف کنید. به جای آن از شناسه شناسه استفاده کنید، به مهاجرت از ورود به سیستم Google مراجعه کنید.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() قدیمی را با جدید جایگزین کنید
GoogleUser.getHostedDomain() حذف کنید
GoogleUser.getId() حذف کنید
GoogleUser.grantOfflineAccess() حذف کنید، جریان کد مجوز را دنبال کنید.
GoogleUser.grant() حذف کنید
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() قدیمی را با جدید جایگزین کنید
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() حذف کنید. بارگیری HTML DOM عنصر g_id_signin یا تماس JS با google.accounts.id.renderButton باعث ورود کاربر به یک حساب Google می شود.

نمونه مدارک

اعتبارنامه های موجود

کتابخانه پلتفرم ورود به سیستم Google ، کتابخانه سرویس گیرنده Google API برای جاوا اسکریپت ، یا تماس‌های مستقیم با نقاط پایانی Google Auth 2.0 هر دو نشانه دسترسی OAuth 2.0 و رمز OpenID Connect ID را در یک پاسخ برمی‌گردانند.

پاسخ نمونه شامل 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 Identity Services برمی‌گرداند:

  • یا یک نشانه دسترسی زمانی که برای مجوز استفاده می شود:

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

پاسخ نشانه نامعتبر است

نمونه پاسخ Google هنگام تلاش برای درخواست 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"
    }
  }