Google Kimlik Hizmetleri'ne geçiş yapın

Genel Bakış

Google API'lerini çağırmak üzere kullanıcı başına erişim jetonu almak için Google, JavaScript kitaplıkları:

Bu kılavuzda, söz konusu kitaplıklardan Google Kimlik Hizmetleri Kitaplığı.

Bu kılavuzdan yararlanarak:

  • kullanımdan kaldırılan Platform Kitaplığı'nı Kimlik Hizmetleri kitaplığıyla, ve
  • API İstemci Kitaplığı kullanıyorsanız kullanımdan kaldırılan gapi.auth2 modülünü kaldırın, yöntemlerini ve nesnelerini, bunların yerine Kimlik Hizmetleri'ni eşdeğerlerini getirir.

Kimlik Hizmetleri JavaScript'inde yapılan değişikliklerin açıklaması için kitaplığını incelemek için genel bakış ve kullanıcı yetkilendirmesinin işleyiş şekli bölümlerini okuyun temel terimler ve kavramlar.

Kullanıcı kaydı ve oturum açma işlemleri için kimlik doğrulaması arıyorsanız Bunun yerine Google ile Oturum Açma'dan taşıma.

Yetkilendirme akışınızı tanımlama

Olası iki kullanıcı yetkilendirme akışı vardır: örtülü ve yetkilendirme girin.

Şu anki yetkilendirme akışı türünü belirlemek için web uygulamanızı inceleyin yardımcı oluyorum.

Web uygulamanızın dolaylı akışı kullandığını belirtir:

  • Web uygulamanız tamamen tarayıcı tabanlıdır ve arka uç platformu yoktur.
  • Kullanıcı, Google API'lerini çağırmak için mevcut olmalıdır. Uygulamanız yalnızca erişimi kullanır ve yenileme jetonları gerektirmez.
  • Web uygulamanız apis.google.com/js/api.js uygulamasını yüklüyor.
  • Uygulamanız, İstemci Tarafı Web için OAuth 2.0 Uygulamalar.
  • Uygulamanız şurada bulunan gapi.client veya gapi.auth2 modüllerini kullanıyor: JavaScript için Google API İstemci Kitaplığı.

Web uygulamanızın yetkilendirme kodu akışını kullandığını belirtiler:

  • Uygulamanız aşağıdakilere dayanır:

  • Uygulamanız hem kullanıcının tarayıcısında hem de arka uç platformunuzda yürütülür.

  • Arka uç platformunuz, bir yetkilendirme kodu uç noktası barındırıyor.

  • Arka uç platformunuz, gerek kalmadan kullanıcılar adına Google API'lerini çağırır. mevcut olmasını sağlar. Bu, çevrimdışı mod olarak da bilinir.

  • Yenileme jetonları arka uç platformunuz tarafından yönetilir ve depolanır.

Bazı durumlarda kod tabanınız her iki akışı da destekleyebilir.

adımlarını uygulayın.

Yetkilendirme akışı seçin

Taşımanıza başlamadan önce gereksinimlerinizi en iyi karşılayacak şekilde, mevcut bir akış ile farklı bir akışa geçebilirsiniz.

Temel farkları anlamak için yetkilendirme akışı seçme başlıklı makaleyi inceleyin ve ödün vermeden.

Çoğu durumda, yetkilendirme kodu akışı, en üst düzey kullanıcı güvenliği. Bu akışı uygulamak ayrıca güncellemeleri almak gibi yeni çevrimdışı işlevleri daha kolay eklemek için takvim, fotoğraf, abonelik ve aboneliklerinde yapılan önemli değişiklikleri kullanıcılara bu şekilde devam eder.

Aşağıdaki seçicileri kullanarak bir yetkilendirme akışı seçin.

Örtülü akış

Kullanıcı mevcut olduğunda tarayıcı içi kullanım için bir erişim jetonu alın.

Dolaylı akış örnekleri, web uygulamalarını Kimlik Hizmetleri.

Yetkilendirme kodu akışı

Google tarafından verilen kullanıcı başına bir yetkilendirme kodu arka ucunuza gönderilir platformu üzerinde daha sonra erişim jetonu ve yenileme jetonuyla değiştirilir.

Yetkilendirme kodu akışı örnekleri web uygulamalarını işlem öncesinde ve sonrasında gösterir Kimlik Hizmetleri'ne taşıma.

Bu kılavuz boyunca Ekle'yi, Mevcut işlevleri kaldırın, güncelleyin veya değiştirin.

Tarayıcı içi web uygulamanızda yapılan değişiklikler

Bu bölümde, JavaScript kitaplığına taşımanızı sağlar.

Etkilenen kodu belirleme ve test etme

Hata ayıklama çerezi, etkilenen kodu bulmanıza ve kullanımdan kaldırma sonrasında test etmenize yardımcı olabilir. gösterir.

Büyük veya karmaşık uygulamalarda, gapi.auth2 modülünün kullanımdan kaldırılması. Yakında mevcut kullanımın işlevin son durumunu konsola eklerseniz, informational için G_AUTH2_MIGRATION çerez. İsteğe bağlı olarak, arka arkaya iki nokta üst üste oturum depolama alanına da giriş yapmak için bir anahtar değerine göre ayarlayın. Oturum açıldıktan sonra ve kimlik bilgilerinin alınması ve toplanan günlükleri daha sonra kullanılmak üzere bir arka uca göndermeleri gerekir. analiz. Örneğin, informational:showauth2use kaynağı ve URL'yi showauth2use adlı oturum depolama anahtarı.

gapi.auth2 modülü artık yüklenmediğinde uygulama davranışını doğrulamak için G_AUTH2_MIGRATION çerezinin değerini enforced olarak değiştirin. Böylece ekip üyeleri yaptırım tarihinden önce inceleme yapması gerekir.

Olası G_AUTH2_MIGRATION çerez değerleri:

  • enforced gapi.auth2 modülünü yüklemeyin.
  • informational Desteği sonlandırılan işlevlerin kullanımını JS konsoluna kaydedin. Ayrıca günlüğe kaydet oturum depolama alanına ekleme işlemini yapabilirsiniz: informational:key-name

Kullanıcıların etkisini en aza indirmek için önce bu çerezi yerel olarak ayarlamanız önerilir üretim ortamlarında kullanmadan önce geliştirme ve test sırasında kullanılması gerektiğini unutmayın.

Kitaplıklar ve modüller

gapi.auth2 modülü, oturum açma işlemi ve örtülü doğrulama için kullanıcı kimlik doğrulamasını yönetir. aktarmasını önlemek için, desteği sonlandırılmış modülü ve nesnelerini kitaplığındaki kişilerle ilgili daha fazla bilgi edindiniz.

Kimlik Hizmetleri Kitaplığını doküman:

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

auth2 modülünü gapi.load('auth2', function) kullanarak yükleme örneklerini kaldırın.

Google Kimlik Hizmetleri kitaplığı, gapi.auth2 modülünün kullanımının yerini alır. Google API'sından gapi.client modülünü kullanmaya güvenle devam edebilirsiniz JavaScript için İstemci Kitaplığı'nı kullanın ve otomatik oluşturma özelliğinden yararlanın birden fazla API çağrısını toplu hale getiren, çağrılabilir JS yöntemlerinin bulunduğu bir boyut ve CORS yönetimi işlevini öğreneceksiniz.

Çerezler

Kullanıcı yetkilendirmesi çerez kullanımını gerektirmez.

Kullanıcı kimlik doğrulamasının nasıl yapılacağıyla ilgili ayrıntılar için Google ile Oturum Açma'dan taşıma başlıklı makaleyi inceleyin ve Google'ın çerezleri nasıl kullandığı hakkında, Google ürün ve hizmetleri.

Kimlik bilgileri

Google Kimlik Hizmetleri, kullanıcı kimlik doğrulamasını ve yetkilendirmesini iki ayrı işlem, kullanıcı kimlik bilgileri ise ayrıdır: bir kullanıcının, kullanılan erişim jetonundan ayrı olarak döndürüldüğünü yetkilendirme.

Bu değişiklikleri görüntülemek için örnek kimlik bilgilerine bakın.

Örtülü akış

Kullanıcı profilini kaldırarak kullanıcı kimlik doğrulamasını ve yetkilendirmesini ayırın işlemleri de yapılabilir.

Şu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:

Yöntemler

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

Yetkilendirme kodu akışı

Kimlik Hizmetleri, tarayıcı içi kimlik bilgilerini kimlik jetonu ve erişim olarak ayırır jeton. Bu değişiklik, doğrudan erişim yoluyla alınan kimlik bilgileri için geçerli değildir. Google OAuth 2.0 uç noktalarına yapılan ve arka uç platformunuzdan veya Google Cloud Platform API'ler Node.js Client'ı kullanın.

Oturum durumu

Google ile Oturum Açma, önceden aşağıdakileri kullanarak kullanıcıların oturum açma durumunu yönetmenize yardımcı oldu:

Web sunucunuzdaki oturum açma durumunu ve kullanıcı oturumlarını yönetmek sizin sorumluluğunuzdadır uygulamasını indirin.

Şu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:

Nesneler:

  • gapi.auth2.SignInOptions

Yöntemler:

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

İstemci yapılandırması

Örtülü veya açık kaynaklı kod istemcisini başlatmak için web uygulamanızı yetkilendirme kodu akışı.

Şu Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:

Nesneler:

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

Yöntemler:

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

Örtülü akış

Şuna bir TokenClientConfig nesnesi ve initTokenClient() çağrısı ekleyin: bir jeton başlatma bölümündeki örneği izleyerek web uygulamanızı yapılandırın. gerekir.

Google ile Oturum Açma JavaScript istemci referanslarını Google ile değiştirin Kimlik Hizmetleri:

Nesneler:

  • TokenClientConfig ile gapi.auth2.AuthorizeConfig

Yöntemler:

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

Parametreler:

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

Yetkilendirme kodu akışı

Yapılandırmak için bir CodeClientConfig nesnesi ve initCodeClient() çağrısı ekleyin Kod İstemcisi başlatma başlıklı makaledeki örneği uygulayarak web uygulamanızda oturum açın.

Örtülü koddan yetkilendirme kodu akışına geçiş yaparken:

Google ile Oturum Açma JavaScript istemci referanslarını kaldırın

Nesneler:

  • gapi.auth2.AuthorizeConfig

Yöntemler:

  • gapi.auth2.init()

Parametreler:

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

Jeton isteği

Düğme tıklaması gibi bir kullanıcı hareketi, doğrudan kullanıcının tarayıcısına döndürülen erişim jetonunu kullanıcı başına yetkilendirme kodu değişiminin ardından arka uç platformunuza ve yenileme jetonu kullanın.

Örtülü akış

Erişim jetonları, kullanıcı tarayıcı içinde alınıp kullanılabilir. oturum açmış ve Google'da etkin bir oturumu olan kullanıcılar gerekir. Örtülü modda kullanıcı daha önce kayıt yapılmış olsa bile, erişim jetonu istemek için hareket gereklidir isteği gönderin.

Değiştir Google ile Oturum Açma JavaScript istemci referansları: Google ile Kimlik Hizmetleri:

Yöntemler:

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

requestAccessToken() adlı iş ortağını aramak için bir bağlantı veya düğme ekleyin erişim jetonu istemek veya erişim jetonu istendiğinde yeni bir jeton almak için pop-up kullanıcı deneyimi akışı mevcut jetonun süresi dolarsa.

Kod tabanınızı şu şekilde güncelleyin:

  • requestAccessToken() ile OAuth 2.0 jeton akışını tetikleyin.
  • requestAccessToken ve Bir isteği birçok kapsama ayırmak için OverridableTokenClientConfig daha küçük isteklere dönüştürmenizi sağlar.
  • Mevcut jetonun süresi dolduğunda veya iptal edildiğinde yeni bir jeton isteyin.

Birden çok kapsamla çalışmak, kod tabanınızda yapısal değişiklikler gerektirebilir. kapsamlara tek seferde değil, yalnızca ihtiyaç duyulduğunda erişim talep etmek, buna artımlı yetkilendirme denir. Her istek kapsam, tercihen tek bir kapsam olmalıdır. Kullanıcıları nasıl ele alacağınızı öğrenin öğrenmek için uygulamanızı artımlı yöntemle güncelleme hakkında daha fazla bilgi için yetkilendirme.

Bir erişim jetonunun süresi dolduğunda gapi.auth2 modülü, web uygulamanız için yeni ve geçerli bir erişim jetonu eklemeniz gerekir. Bu, kullanıcı güvenliğini artırmak için Google Kimliği, otomatik jeton yenileme işlemini desteklemez. Hizmet kitaplığı'nı tıklayın. Web uygulamanız, süresi dolmuş erişimi algılamak için güncellenmelidir yeni bir kod isteyin. Daha fazla bilgi için aşağıdaki Jeton işleme bölümüne bakın.

Yetkilendirme kodu akışı

requestCode() numaralı telefonu yetkilendirmek üzere telefonla aramak için bir bağlantı veya düğme ekleyin Google'dan alır. Örnek için OAuth 2.0 Kod Akışını Tetikleme bölümüne bakın.

Bir erişim belirtecinin süresi dolmuş veya iptal edilmiş olabilir.

Jeton işleme

Kullanım süresi dolduğunda veya hem de yeni ve geçerli bir erişim jetonu istemek için kullanılır.

401 Unauthorized ve invalid_token hata mesajının HTTP durum kodu süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında Google API'leri tarafından döndürülen veriler bulunur. Örneğin, örnek için Geçersiz jeton yanıtı bölümüne bakın.

Süresi dolmuş jetonlar

Erişim jetonları kısa ömürlüdür ve genellikle yalnızca birkaç dakika için geçerlidir.

Jeton iptali

Google Hesabı sahibi, önceden verilen izni istediği zaman iptal edebilir. Yapmak Bu nedenle, mevcut erişim jetonları ve yenileme jetonları geçersiz kılınır. İptal etme revoke() kullanılarak veya Google üzerinden tetiklendi. Hesap.

Değiştir Google ile Oturum Açma JavaScript istemci referansları: Google ile Kimlik Hizmetleri:

Yöntemler:

  • google.accounts.oauth2.revoke() ile getAuthInstance().disconnect()
  • google.accounts.oauth2.revoke() ile GoogleUser.disconnect()

Kullanıcı, platformunuzda hesabını sildiğinde revoke adlı cihazı çağırın veya uygulamanızla veri paylaşma iznini kaldırmak istiyor.

Web uygulamanız veya arka ucunuz Google tarafından, kullanıcıya bir erişim jetonu talep eder. Gösterilen örnek rıza iletişim kutularına bakın Google tarafından kullanıcılara.

Uygulamanıza erişim jetonu vermeden önce mevcut ve etkin bir Google kullanıcı izni istemek ve sonucu kaydetmek için oturum gereklidir. Kullanıcı mevcut bir oturumda oturum açılmamışsa Google Hesabı'nda zaten yerleşikler.

Kullanıcı oturumu açma

Kullanıcılar, Google Hesabı'nda ayrı bir tarayıcı sekmesinde veya yerel olarak oturum açabilir. tarayıcı veya işletim sistemi üzerinden erişilebilir. Şununla Oturum Açın: Bir Google Hesabı arasında etkin bir oturum oluşturmak için Google'ı sitenize ekleme ve kullanıcı uygulamanızı ilk açtığındaki tarayıcı. Böylece bu özellikler avantajları:

  • Kullanıcının oturum açarak erişim isteme sayısını en aza indirir açık bir oturum başladığında Google Hesabı oturum açma işlemini başlatır. zaten mevcut değil.
  • JWT Kimlik Jetonu credential email alanını CodeClientConfig veya TokenClientConfig tablosundaki login_hint parametresi nesneler'i tıklayın. Bu, özellikle platformunuzda tutarlı bir kullanıcı hesabı yönetim sistemi.
  • Bir Google Hesabını mevcut bir yerel kullanıcı hesabıyla ilişkilendirin ve Bu da platformunuzda yinelenen hesapları en aza indirmenize yardımcı olur.
  • Yeni bir yerel hesap oluşturulduğunda, kayıt iletişim kutularınız ve akışınız kullanıcı kimlik doğrulama iletişim kutularından ve akışlarından açıkça ayrılmış olarak sayısını artırmak ve ayrılma oranını artırmaktır.

Kullanıcılar oturum açtıktan sonra ve erişim jetonu verilmeden önce erişim izni vermelidir. .

İzinden sonra, bir erişim jetonu ve onaylanan kapsamların listesi döndürülür. veya kullanıcı tarafından reddedilmiştir.

Ayrıntılı izinler, kullanıcıların tek tek kapsamları onaylamasına veya reddetmesine olanak tanır. Zaman birden fazla kapsama erişim isteğinde bulunduğunda, her kapsam verilir veya reddedilir. diğer kapsamlardan bağımsızdır. Uygulamanız için kullanıcı tercihine göre seçime dayalıdır bağımsız bir kapsama bağlı özellikleri ve işlevleri etkinleştirir.

Örtülü akış

Google ile Oturum Açma JavaScript istemci referanslarını Google ile değiştirin Kimlik Hizmetleri:

Nesneler:

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

Yöntemler:

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

Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:

Yöntemler:

  • GoogleUser.getAuthResponse()

Web uygulamanızı hasGrantedAllScopes() ve<br> hasGrantedAnyScope() için bu ayrıntılı izinler örneğini uygulayın.

Yetkilendirme kodu akışı

Arka ucunuza yetkilendirme kodu uç noktası güncelleyin veya ekleyin platformuna ilişkin yetkilendirme kodunu işleme bölümündeki talimatları uygulayın.

Platformunuzu, Kodu Kullanma başlıklı makalede açıklanan adımları uygulayacak şekilde güncelleyin İsteği doğrulamak, erişim jetonu alıp yenilemek için model rehberi jeton.

Belirli özellikleri etkinleştirmek veya devre dışı bırakmak için platformunuzu güncelleyerek kullanıcının onayladığı kapsamlara göre belirlenen farklı işlevlere sahiptir. artımlı yetkilendirme ve araştırma talimatlarına kullanıcı tarafından verilen erişim kapsamlarıdır.

Örtülü akış örnekleri

Eski yöntem

GAPI İstemci Kitaplığı

JavaScript için Google API İstemci Kitaplığı örneği kullanıcının izni için bir pop-up iletişim kutusu kullanılarak tarayıcıda çalışıyor.

gapi.auth2 modülü otomatik olarak yüklenir ve gapi.client.init() gibi liste dışıdır.

<!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 İstemci Kitaplığı

Tarayıcıda çalışan İstemci Tarafı Web Uygulamaları için OAuth 2.0 kullanıcı rızası pop-up iletişim kutusu.

gapi.auth2 modülü manuel olarak yüklenir.

<!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 Uç Noktaları

Tarayıcıda çalışan İstemci Tarafı Web Uygulamaları için OAuth 2.0 Kullanıcı izni için Google'a yönlendirir.

Bu örnekte, kullanıcının tarayıcısı ve gapi.auth2 modülünü veya bir JavaScript'i kullanmıyor kitaplığını açar.

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

Yeni yöntem

Yalnızca Coğrafi Bilgi Sistemi

Bu örnekte yalnızca Google Kimlik Hizmeti JavaScript kitaplığı gösterilmektedir Jeton modelini kullanarak ve kullanıcı rızası için pop-up iletişim kutusu açarak güncelleyin. Evet yapılandırmak için gereken minimum adım sayısını erişim jetonu isteme, edinme ve bir Google API çağırma işlemlerini yapabilir.

<!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 eş zamansız/bekliyor

Bu örnekte, jeton modelini kullanın, gapi.auth2 modülünü kaldırın ve JavaScript için Google API İstemci Kitaplığı.

Promises, eşzamansız ve bekleme özellikleri, kitaplık yükleme sırasının zorunlu kılınması ve yetkilendirme hatalarını bulup yeniden deneyin. API çağrısı yalnızca geçerli bir erişim jetonunun mevcut olduğunu doğrulayın.

Kullanıcıların 'Takvimi Göster' düğmesine basması beklenir düğmesini seçtiğinizde Sayfa ilk yüklendiğinde veya erişim jetonundan sonra yok süresi doldu.

<!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 geri çağırması

Bu örnekte, jeton modelini kullanın, gapi.auth2 modülünü kaldırın ve JavaScript için Google API İstemci Kitaplığı.

Değişkenler, kitaplık yükleme sırasını zorunlu kılmak için kullanılır. GAPI çağrıları yapılır işlevini çağırır.

Sayfa ilk açıldığında kullanıcıların Takvimi Göster düğmesine basmaları beklenir takvimini yeniden yükleyebilir.

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

Yetkilendirme kod akışı örnekleri

Google Kimlik Hizmeti kitaplığı pop-up kullanıcı deneyimi, doğrudan arka uç jetonu uç noktanıza bir yetkilendirme kodu döndürebilir veya Kullanıcının tarayıcısında çalışan JavaScript geri çağırma işleyicisi; yanıt verebilmeniz için kritik öneme sahiptir. Her iki durumda da arka uç platformunuz OAuth 2.0 akışını gerçekleştirmek için gereken adımları uygulayın.

Eski yöntem

Sunucu Tarafı Web Uygulamaları

Arka uç platformunda çalışan sunucu tarafı uygulamalar için Google ile Oturum Açma kullanıcı izni için Google'a yönlendirme kullanarak.

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

Yönlendirme kullanan HTTP/REST

Yetkilendirme kodu göndermek için Web Sunucusu Uygulamaları için OAuth 2.0'ı kullanma kullanıcının tarayıcısından arka uç platformunuza. Kullanıcı rızasını işleyen Kullanıcının tarayıcısını Google'a yönlendirme.

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

Yeni yöntem

Coğrafi Bilgi Sistemi Pop-up Kullanıcı Deneyimi

Bu örnekte yalnızca Google Kimlik Hizmeti JavaScript kitaplığı gösterilmektedir yetkilendirme kodu modelini kullanarak kullanıcı izni ve geri çağırma işleyiciyi kullanabilirsiniz. Evet yapılandırmak için gereken minimum adım sayısını kullanıcı izni almak ve arka ucunuza yetkilendirme kodu göndermek platformu.

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

Coğrafi Bilgi Sistemi Yönlendirme Kullanıcı Deneyimi

Yetkilendirme kodu modeli pop-up'ı destekler ve kullanıcı deneyimi modlarını Platformunuz tarafından barındırılan uç noktaya kullanıcı başına bir yetkilendirme kodu gönderin. Yönlendirme kullanıcı deneyimi modu burada gösterilir:

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

JavaScript kitaplıkları

Google Kimlik Hizmetleri, kullanıcılar için kullanılan tek bir JavaScript kitaplığıdır özellikleri birleştirerek bunların yerini alan kimlik doğrulama ve yetkilendirme şu işlevlere sahip olabilirsiniz:

Kimlik Hizmetleri'ne taşıma sırasında yapılacak işlemler:

Mevcut JS kitaplığı Yeni JS kitaplığı Notlar
apis.google.com/js/api.js accounts.google.com/gsi/client Yeni kitaplık ekleyin ve dolaylı akışı izleyin.
apis.google.com/js/client.js accounts.google.com/gsi/client Yeni kitaplık ve yetkilendirme kodu akışını ekleyin.

Kitaplık hızlı referansı

Eski Google ile Oturum Açma JavaScript'i arasındaki nesne ve yöntem karşılaştırması client kitaplığını ve Yeni Google Kimlik Hizmetleri kitaplığını Ek bilgileri ve taşıma sırasında yapılacak işlemleri içeren notlar.

Önceki Yeni Notlar
GoogleAuth nesnesi ve ilişkili yöntemler:
GoogleAuth.attachClickHandler() Kaldır
GoogleAuth.currentUser.get() Kaldır
GoogleAuth.currentUser.listen() Kaldır
GoogleAuth.disconnect() google.accounts.oauth2.revoke Eskiyi yenisiyle değiştir. İptal etme işlemi https://myaccount.google.com/permissions adresinden de yapılabilir.
GoogleAuth.grantOfflineAccess() Kaldır, yetkilendirme kodu akışını uygulayın.
GoogleAuth.isSignedIn.get() Kaldır
GoogleAuth.isSignedIn.listen() Kaldır
GoogleAuth.signIn() Kaldır
GoogleAuth.signOut() Kaldır
GoogleAuth.then() Kaldır
GoogleUser nesnesi ve ilişkili yöntemler:
GoogleUser.disconnect() google.accounts.id.revoke Eskiyi yenisiyle değiştir. İptal etme işlemi https://myaccount.google.com/permissions adresinden de yapılabilir.
GoogleUser.getAuthResponse() requestCode() or requestAccessToken() Eskiyi yenisiyle değiştir
GoogleUser.getBasicProfile() Kaldır'a dokunun. Bunun yerine Kimlik Jetonu'nu kullanın. Google ile Oturum Açma'dan taşıma bölümünü inceleyin.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() Eskiyi yenisiyle değiştir
GoogleUser.getHostedDomain() Kaldır
GoogleUser.getId() Kaldır
GoogleUser.grantOfflineAccess() Kaldır, yetkilendirme kodu akışını uygulayın.
GoogleUser.grant() Kaldır
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() Eskiyi yenisiyle değiştir
GoogleUser.isSignedIn() Kaldır
GoogleUser.reloadAuthResponse() requestAccessToken() Süresi dolmuş veya iptal edilmiş erişim jetonunu değiştirmek için eski, yeni çağrıyı kaldırın.
gapi.auth2 nesnesi ve ilişkili yöntemler:
gapi.auth2.AuthorizeConfig nesnesi TokenClientConfig veya CodeClientConfig Eskiyi yenisiyle değiştir
gapi.auth2.AuthorizeResponse nesnesi Kaldır
gapi.auth2.AuthResponse nesnesi Kaldır
gapi.auth2.authorize() requestCode() or requestAccessToken() Eskiyi yenisiyle değiştir
gapi.auth2.ClientConfig() TokenClientConfig veya CodeClientConfig Eskiyi yenisiyle değiştir
gapi.auth2.getAuthInstance() Kaldır
gapi.auth2.init() initTokenClient() or initCodeClient() Eskiyi yenisiyle değiştir
gapi.auth2.ÇevrimdışıAccessOptions nesnesi Kaldır
gapi.auth2.SignInOptions nesnesi Kaldır
gapi.signin2 nesnesi ve ilişkili yöntemler:
gapi.signin2.render() Kaldır'a dokunun. g_id_signin öğesi veya JS çağrısı google.accounts.id.renderButton Google Hesabı'nda kullanıcının oturum açmasını tetikler.

Örnek kimlik bilgileri

Mevcut kimlik bilgileri

Google ile Oturum Açma platformu kitaplığı, Google API İstemci Kitaplığı JavaScript veya doğrudan Google Auth 2.0 uç noktalarına yapılan çağrılar döndürülür OAuth 2.0 erişim jetonu ve COPPA Connect ID Jetonu tek seferde hem OAuth 2.0 erişim jetonu tıklayın.

Hem access_token hem de id_token içeren örnek yanıt:

  {
    "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 Kimlik Hizmetleri kimlik bilgisi

Google Kimlik Hizmetleri kitaplığı şunları döndürür:

  • ya da yetkilendirme için kullanıldığında bir erişim jetonundan yararlanabilirsiniz:

    {
      "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"
    }
    
  • veya kimlik doğrulama için kullanıldığında bir kimlik jetonu:

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

Geçersiz jeton yanıtı

Bir süresi dolmuş, iptal edilmiş veya geçersiz erişim belirteci:

HTTP Yanıtı Üstbilgileri

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

Yanıt metni

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