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

Genel Bakış

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

Bu kılavuzda, bu kitaplıklardan Google Kimlik Hizmetleri kitaplığına geçişle ilgili talimatlar verilmektedir.

Bu rehberde anlatılanları uygulayarak:

  • Desteği sonlandırılan Platform Kitaplığı'nı Kimlik Hizmetleri kitaplığıyla değiştirin ve
  • API İstemci Kitaplığı kullanıyorsanız desteği sonlandırılan gapi.auth2 modülünü, yöntemlerini ve nesnelerini kaldırıp Kimlik Hizmetleri'ndeki eşdeğerleriyle değiştirin.

Identity Services JavaScript kitaplığında nelerin değiştiğine dair bir açıklama için genel bakış bölümünü okuyun ve temel terimleri ve kavramları incelemek için kullanıcı yetkilendirmesinin işleyiş şekli başlıklı makaleyi inceleyin.

Kullanıcıların kaydolması ve oturum açması için kimlik doğrulama istiyorsanız Google ile Oturum Açma'dan geçiş başlıklı makaleyi inceleyin.

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

İki olası kullanıcı yetkilendirme akışı vardır: örtülü ve yetkilendirme kodu.

Şu anda kullanılan yetkilendirme akışı türünü belirlemek için web uygulamanızı inceleyin.

Web uygulamanızın örtülü akışı kullandığına dair göstergeler:

  • Web uygulamanız tamamen tarayıcı tabanlı ve arka uç platformu içermiyor.
  • Google API'lerini çağırabilmek için kullanıcının mevcut olması gerekir. Uygulamanız yalnızca erişim jetonları kullanır ve yenileme jetonu gerektirmez.
  • Web uygulamanız apis.google.com/js/api.js yüklenir.
  • Uygulamanız İstemci Tarafı Web Uygulamaları için OAuth 2.0'a dayanır.
  • Uygulamanız, JavaScript için Google API İstemci Kitaplığı'nda bulunan gapi.client veya gapi.auth2 modüllerini kullanıyor.

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 çalışır.

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

  • Arka uç platformunuz, kullanıcıların mevcut olması gerekmeden kullanıcılar adına Google API'lerini çağırır. Bu durum, ç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.

Yetkilendirme akışı seçin

Taşıma işleminizi başlatmadan önce, mevcut akışınızla devam etmenin mi yoksa farklı bir akış benimsemenin mi ihtiyaçlarınıza en uygun olduğunu belirlemeniz gerekir.

İki akış arasındaki temel farkları ve avantajları/dezavantajları anlamak için yetkilendirme akışı seçme başlıklı makaleyi inceleyin.

Çoğu durumda, en yüksek düzeyde kullanıcı güvenliği sunduğu için yetkilendirme kodu akışı önerilir. Bu akışı uygulamak, platformunuzun kullanıcıları takvimlerinde, fotoğraflarında, aboneliklerinde vb. önemli değişikliklerden haberdar etmek için güncelleme getirme gibi yeni çevrimdışı işlevleri daha kolay eklemesine de olanak tanır.

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

Dolaylı akış

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

Dolayısız akış örnekleri, Identity Services'e taşınmadan önce ve taşındıktan sonra web uygulamalarını gösterir.

Yetkilendirme kodu akışı

Google tarafından verilen kullanıcı başına yetkilendirme kodu, arka uç platformunuza gönderilir ve burada erişim jetonu ve yenileme jetonuyla değiştirilir.

Yetkilendirme kodu akışı örnekleri, Kimlik Hizmetleri'ne geçişten önce ve sonra web uygulamalarını gösterir.

Bu kılavuzda, mevcut işlevleri Eklemek, Kaldırmak, Güncellemek veya Değiştirmek için kalın harflerle listelenen talimatları uygulayın.

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

Bu bölümde, Google Kimlik Hizmetleri JavaScript kitaplığına geçiş yaparken tarayıcı içi web uygulamanızda yapacağınız değişiklikler incelenmektedir.

Etkilenen kodu belirleme ve test etme

Hata ayıklama çerezi, etkilenen kodun yerini belirlemenize ve desteği sonlandırıldıktan sonraki davranışı test etmenize yardımcı olabilir.

Büyük veya karmaşık uygulamalarda, gapi.auth2 modülünün kullanımdan kaldırılmasından etkilenen tüm kodları bulmak zor olabilir. Yakında desteği sonlandırılacak işlevin mevcut kullanımını konsola kaydetmek için G_AUTH2_MIGRATION çerezinin değerini informational olarak ayarlayın. İsteğe bağlı olarak, oturum depolama alanına da günlük kaydetmek için iki nokta üst üste işareti ve ardından bir anahtar değeri ekleyin. Oturum açtıktan ve kimlik bilgilerini aldıktan sonra, daha sonra analiz etmek için toplanan günlükleri inceleyin veya arka uç bir sisteme gönderin. Örneğin, informational:showauth2use, kaynağı ve URL'yi showauth2use adlı bir oturum depolama anahtarına kaydeder.

gapi.auth2 modülü artık yüklenmediğinde uygulama davranışını doğrulamak için G_AUTH2_MIGRATION çerezinin değerini enforced olarak ayarlayın. Bu sayede, desteği sonlandırıldıktan sonraki davranışı yaptırım tarihinden önce test edebilirsiniz.

Olası G_AUTH2_MIGRATION çerez değerleri:

  • enforced gapi.auth2 modülü yüklenmez.
  • informational Desteği sonlandırılan işlevlerin kullanımını JS konsoluna kaydedin. İsteğe bağlı bir anahtar adı ayarlandığında oturum depolama alanına da günlük kaydedilir: informational:key-name.

Kullanıcı üzerindeki etkiyi en aza indirmek için bu çerezi üretim ortamlarında kullanmadan önce geliştirme ve test sırasında yerel olarak ayarlamanız önerilir.

Kitaplıklar ve modüller

gapi.auth2 modülü, oturum açma için kullanıcı kimlik doğrulamasını ve yetkilendirme için örtülü akışı yönetir. Desteği sonlandırılan bu modülü ve nesnelerini ve yöntemlerini Google Kimlik Hizmetleri kitaplığıyla değiştirin.

Kimlik Hizmetleri kitaplığını belgenize ekleyerek web uygulamanıza ekleyin:

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

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

Google Kimlik Hizmetleri kitaplığı, gapi.auth2 modülünün kullanımını değiştirir. JavaScript için Google API İstemci Kitaplığı'ndaki gapi.client modülünü güvenle kullanmaya devam edebilir, bir keşif belgesinden çağrılabilir JS yöntemlerinin otomatik olarak oluşturulmasından, birden fazla API çağrısının toplu olarak yapılmasından ve CORS yönetim işlevinden yararlanabilirsiniz.

Çerezler

Kullanıcı yetkilendirmesi için çerez kullanılması gerekmez.

Kullanıcı kimlik doğrulamasının çerezleri nasıl kullandığıyla ilgili ayrıntılar için Google ile oturum açma'dan geçiş başlıklı makaleyi, diğer Google ürün ve hizmetlerinin çerez kullanımıyla ilgili ayrıntılar için Google'ın çerezleri nasıl kullandığı başlıklı makaleyi inceleyin.

Kimlik bilgileri

Google Kimlik Hizmetleri, kullanıcı kimlik doğrulamasını ve yetkilendirmeyi iki ayrı işleme ayırır. Ayrıca kullanıcı kimlik bilgileri de ayrıdır: Kullanıcıyı tanımlamak için kullanılan kimlik jetonu, yetkilendirme için kullanılan erişim jetonundan ayrı olarak döndürülür.

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

Dolaylı akış

Kullanıcı profili işlemeyi yetkilendirme akışlarından kaldırarak kullanıcı kimlik doğrulamasını ve yetkilendirmeyi ayırın.

Aşağıdaki Google ile Oturum Açma JavaScript istemci referanslarını kaldırın:

Yöntemler

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

Yetkilendirme kodu akışı

Identity Services, tarayıcı içi kimlik bilgilerini kimlik jetonu ve erişim jetonu olarak ayırır. Bu değişiklik, arka uç platformunuzdan Google OAuth 2.0 uç noktalarına doğrudan çağrılar veya platformunuzdaki güvenli bir sunucuda çalışan Google API'leri Node.js İstemcisi gibi kitaplıklar aracılığıyla elde edilen kimlik bilgileri için geçerli değildir.

Oturum durumu

Daha önce Google ile oturum açma, kullanıcıların oturum açma durumunu yönetmenize aşağıdakileri kullanarak yardımcı oluyordu:

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

Aşağıdaki 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ü kod veya yetkilendirme kod akışı için bir jeton istemcisini başlatmak için web uygulamanızı güncelleyin.

Aşağıdaki 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()

Dolaylı akış

Jeton istemcisini başlatma bölümündeki örneği izleyerek web uygulamanızı yapılandırmak için bir TokenClientConfig nesnesi ve initTokenClient() çağrısı ekleyin.

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

Nesneler:

  • TokenClientConfig ile gapi.auth2.AuthorizeConfig

Yöntemler:

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

Parametreler:

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

Yetkilendirme kodu akışı

Code Client'ı başlatma başlıklı makaledeki örneği izleyerek web uygulamanızı yapılandırmak için bir CodeClientConfig nesnesi ve initCodeClient() çağrısı ekleyin.

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

Google 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, erişim jetonunun doğrudan kullanıcının tarayıcısından (örtülü akışla) veya kullanıcı başına yetkilendirme koduyla erişim jetonu ve yenileme jetonu alışverişi yapıldıktan sonra arka uç platformunuza döndürülmesiyle sonuçlanan bir istek oluşturur.

Dolaylı akış

Kullanıcı oturum açmış ve Google'da etkin bir oturumu varsa erişim jetonları tarayıcıda edinilebilir ve kullanılabilir. Örtük modda, daha önce bir istek yapılmış olsa bile erişim jetonu istemek için kullanıcı hareketi gerekir.

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

Yöntemler:

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

Erişim jetonu istemek için pop-up kullanıcı deneyimi akışını başlatmak veya mevcut jetonun süresi dolduğunda yeni bir jeton almak üzere requestAccessToken() işlevini çağırmak için bir bağlantı veya düğme ekleyin.

Kod tabanınızı aşağıdaki şekilde güncelleyin:

  • requestAccessToken() ile OAuth 2.0 jeton akışını tetikleyin.
  • Birçok kapsam için tek bir isteği birden fazla küçük isteğe ayırmak üzere requestAccessToken ve OverridableTokenClientConfig kullanarak artımlı yetkilendirmeyi destekleyin.
  • Mevcut jetonun süresi dolduğunda veya iptal edildiğinde yeni bir jeton isteyin.

Birden çok kapsamla çalışmak, kapsamlara aynı anda değil, yalnızca ihtiyaç duyulduğu için erişim istemek için kod tabanınızda yapısal değişiklikler gerektirebilir. Buna artımlı yetkilendirme denir. Her istek mümkün olduğunca az kapsam içermeli ve ideal olarak tek bir kapsam içermelidir. Uygulamanızı artımlı yetkilendirme için nasıl güncelleyeceğiniz hakkında daha fazla bilgi için kullanıcı iznini yönetme başlıklı makaleyi inceleyin.

Bir erişim jetonunun süresi dolduğunda gapi.auth2 modülü, web uygulamanız için otomatik olarak yeni ve geçerli bir erişim jetonu alır. Kullanıcı güvenliğini artırmak için bu otomatik jeton yenileme işlemi Google Identity Services kitaplığı tarafından desteklenmez. Web uygulamanızın, süresi dolmuş bir erişim jetonunu algılayıp yeni bir jeton isteyecek şekilde güncellenmesi gerekir. Daha fazla bilgi için aşağıdaki jeton işleme bölümüne bakın.

Yetkilendirme kodu akışı

Google'dan yetkilendirme kodu istemek için requestCode() adresini çağırmak üzere bir bağlantı veya düğme ekleyin. Örnek için OAuth 2.0 Kod Akışı'nı Tetikleme bölümüne bakın.

Süresi dolmuş veya iptal edilmiş bir erişim jetonuna nasıl yanıt verileceği hakkında daha fazla bilgi için aşağıdaki Jeton işleme bölümüne bakın.

Jetonları işleme

Kullanım süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında başarısız Google API çağrılarını tespit etmek ve yeni, geçerli bir erişim jetonu istemek için hata işleme ekleyin.

Süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında Google API'leri tarafından 401 Unauthorized HTTP durum kodu ve invalid_token hata mesajı döndürülür. Ö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 geçerlidir.

Jeton iptali

Google Hesabı sahibi, önceden verilen izni istediği zaman iptal edebilir. Bu işlem, mevcut erişim ve yenileme jetonlarını geçersiz kılar. İptal işlemi, revoke() kullanılarak veya bir Google Hesabı üzerinden platformunuzdan tetiklenebilir.

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

Yöntemler:

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

Bir kullanıcı platformunuzdaki hesabını sildiğinde veya uygulamanızla veri paylaşma iznini kaldırmak istediğinde revoke çağrısını yapın.

Google, web uygulamanız veya arka uç platformunuz erişim jetonu istediğinde kullanıcıya bir izin iletişim kutusu gösterir. Google'ın kullanıcılara gösterdiği örnek izin iletişim kutularına bakın.

Uygulamanıza erişim jetonu vermeden önce, kullanıcıdan izin istemek ve sonucu kaydetmek için mevcut ve etkin bir Google oturumu gerekir. Mevcut bir oturum oluşturulmamışsa kullanıcının Google Hesabı'nda oturum açması gerekebilir.

Kullanıcı oturum açma

Kullanıcılar, ayrı bir tarayıcı sekmesinde veya tarayıcı ya da işletim sistemi üzerinden yerel olarak bir Google Hesabı'nda oturum açmış olabilir. Kullanıcı uygulamanızı ilk kez açtığında Google Hesabı ile tarayıcı arasında etkin bir oturum oluşturmak için sitenize Google ile oturum aç özelliğini eklemenizi öneririz. Bu işlem aşağıdaki avantajları sağlar:

  • Kullanıcının oturum açması gereken sayıyı en aza indirir. Erişim jetonu istemek, etkin bir oturum yoksa Google Hesabı oturum açma işlemini başlatır.
  • CodeClientConfig veya TokenClientConfig nesnelerindeki login_hint parametresinin değeri olarak JWT kimlik jetonu kimlik bilgisi email alanını doğrudan kullanın. Bu, özellikle platformunuzda kullanıcı hesabı yönetimi sistemi yoksa faydalı olacaktır.
  • Google Hesabı'nı bulup platformunuzdaki mevcut bir yerel kullanıcı hesabıyla ilişkilendirerek platformunuzda yinelenen hesapları en aza indirin.
  • Yeni bir yerel hesap oluşturulduğunda, kayıt iletişim kutularınız ve akışınız kullanıcı kimlik doğrulaması iletişim kutularından ve akışlarından açıkça ayrılabilir. Böylece, gerekli adımların sayısı azaltılır ve ayrılma oranı iyileştirilir.

Kullanıcıların, oturum açtıktan sonra ve erişim jetonu oluşturulmadan önce, istenen kapsamlar için uygulamanızla ilgili izin vermesi gerekir.

İzin verildikten sonra, kullanıcı tarafından onaylanan veya reddedilenlerin listesi ile birlikte bir erişim jetonu döndürülür.

Ayrıntılı izinler, kullanıcıların ayrı kapsamları onaylamalarına veya reddetmelerine olanak tanır. Birden fazla kapsama erişim isteğinde bulunurken her kapsam diğer kapsamlardan bağımsız olarak verilir veya reddedilir. Uygulamanız, kullanıcının seçimine bağlı olarak belirli bir kapsama bağlı özellikleri ve işlevleri seçerek etkinleştirir.

Dolaylı akış

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

Nesneler:

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

Yöntemler:

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

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

Yöntemler:

  • GoogleUser.getAuthResponse()

Bu ayrıntılı izinler örneğini uygulayarak web uygulamanızı hasGrantedAllScopes() ve hasGrantedAnyScope() ile güncelleyin.

Yetkilendirme kodu akışı

Yetkilendirme kodu işleme bölümündeki talimatları uygulayarak arka uç platformunuza bir yetkilendirme kodu uç noktası güncelleyin veya ekleyin.

İsteği doğrulamak, erişim jetonu ve yenileme jetonu almak için Kod Modelini Kullanma kılavuzunda açıklanan adımları uygulayarak platformunuzu güncelleyin.

Artımlı yetkilendirme talimatlarını uygulayarak ve kullanıcı tarafından verilen erişim kapsamlarını inceleyerek kullanıcının onayladığı ayrı ayrı kapsamlara göre özellikleri ve işlevleri seçerek etkinleştirecek veya devre dışı bırakacak şekilde platformunuzu güncelleyin.

Örtük akış örnekleri

Eski yöntem

GAPI İstemci Kitaplığı

Kullanıcı rızası için pop-up iletişim kutusu kullanan tarayıcıda çalışan JavaScript için Google API istemci kitaplığı örneği.

gapi.auth2 modülü, gapi.client.init() tarafından otomatik olarak yüklenir ve kullanılır. Bu nedenle gizlidir.

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

Kullanıcı izni için bir pop-up iletişim kutusu kullanılarak tarayıcıda çalışan İstemci Tarafı Web Uygulamaları için OAuth 2.0.

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ı

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

Bu örnekte, kullanıcının tarayıcısından Google'ın OAuth 2.0 uç noktalarına yapılan doğrudan çağrılar gösterilmektedir ve gapi.auth2 modülü veya JavaScript kitaplığı kullanılmamaktadır.

<!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 Identity Service JavaScript kitaplığı jeton modelini kullanarak ve kullanıcı izni için pop-up iletişim kutusu gösterilmektedir. Bu örnek, istemciyi yapılandırma, erişim jetonu isteme ve alma ve Google API'yi çağırma için gereken minimum adım sayısını göstermek amacıyla sağlanmıştır.

<!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 kullanarak Google Kimlik Hizmeti kitaplığının nasıl ekleneceği, gapi.auth2 modülünün nasıl kaldırılacağı ve JavaScript için Google API İstemci Kitaplığı'nın nasıl çağrılacağı gösterilmektedir.

Promise, async ve await, kitaplık yükleme sırasını zorunlu kılmak ve yetkilendirme hatalarını yakalayıp tekrar denemek için kullanılır. API çağrısı yalnızca geçerli bir erişim jetonu sağlandıktan sonra yapılır.

Kullanıcıların, sayfa ilk yüklendiğinde veya daha sonra erişim jetonunun süresi dolduktan sonra "Takvim'i Göster" düğmesine basmaları beklenir.

<!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ğırma

Bu örnekte, jeton modelini kullanarak Google Identity Service kitaplığının nasıl ekleneceği, gapi.auth2 modülünün nasıl kaldırılacağı ve JavaScript için Google API istemci kitaplığını kullanarak bir API'nin nasıl çağrılacağı gösterilmektedir.

Değişkenler, kitaplık yükleme sırasını zorunlu kılmak için kullanılır. GAPI çağrıları, geçerli bir erişim jetonu döndürüldükten sonra geri çağırma işlevi içinden yapılır.

Kullanıcıların, sayfa ilk yüklendiğinde ve takvim bilgilerini yenilemek istediklerinde Takvim'i Göster düğmesine basmaları gerekir.

<!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 kodu akışı örnekleri

Google Identity Service kitaplığı pop-up kullanıcı deneyimi, doğrudan arka uç jeton uç noktanıza bir yetkilendirme kodu döndürmek için bir URL yönlendirmesi veya kullanıcının tarayıcısında çalışan ve yanıtı platformunuza proxy olarak gönderen bir JavaScript geri çağırma işleyici kullanabilir. Her iki durumda da arka uç platformunuz, geçerli bir yenileme ve erişim jetonu almak için OAuth 2.0 akışını tamamlar.

Eski yöntem

Sunucu tarafı web uygulamaları

Arka uç platformda çalışan ve kullanıcı rızası için Google'a yönlendirme kullanan sunucu tarafı uygulamalar için Google ile oturum açma.

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

Kullanıcının tarayıcısından arka uç platformunuza yetkilendirme kodu göndermek için Web Sunucusu Uygulamaları için OAuth 2.0'ı Kullanma başlıklı makaleyi inceleyin. Kullanıcının tarayıcısını Google'a yönlendirerek kullanıcı izninin alınması.

/\*
 \* 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 yetkilendirme kodu modelini kullanan Google Kimlik Hizmeti JavaScript kitaplığını, Google'dan yetkilendirme kodunu almak için kullanıcı izni ve geri arama işleyici için bir pop-up iletişim kutusu gösterilmektedir. Bu örnek, istemciyi yapılandırmak, izin almak ve arka uç platformunuza yetkilendirme kodu göndermek için gereken minimum adım sayısını göstermek amacıyla sağlanmıştır.

<!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önlendirmesi Kullanıcı Deneyimi

Yetkilendirme kodu modeli, platformunuz tarafından barındırılan uç noktaya kullanıcı başına bir yetkilendirme kodu göndermek için pop-up ve yönlendirme kullanıcı deneyimi modlarını destekler. 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ı kimlik doğrulaması ve yetkilendirme için kullanılan tek bir JavaScript kitaplığıdır. Bu kitaplık, birden fazla farklı kitaplık ve modüldeki özellikleri ve işlevleri birleştirip değiştirir:

Identity Services'e geçiş yaparken yapmanız gereken 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 istemcisi kitaplığı ile yeni Google Kimlik Hizmetleri kitaplığı arasındaki nesne ve yöntem karşılaştırması ve taşıma sırasında yapılacak işlemler ile ek bilgiler 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 yeniyle değiştirin. İzinleri https://myaccount.google.com/permissions adresinden de iptal edebilirsiniz.
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. İzinleri https://myaccount.google.com/permissions adresinden de iptal edebilirsiniz.
GoogleUser.getAuthResponse() requestCode() or requestAccessToken() Eskiyi yeniyle değiştirme
GoogleUser.getBasicProfile() Kaldır'a dokunun. Bunun yerine kimlik jetonu kullanın. Google ile oturum açma özelliğinden geçiş başlıklı makaleyi inceleyin.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() Eskiyi yeniyle değiştirme
GoogleUser.getHostedDomain() Kaldır
GoogleUser.getId() Kaldır
GoogleUser.grantOfflineAccess() Kaldırın, 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 dolan veya iptal edilen erişim jetonunu değiştirmek için eskisini kaldırın ve yenisini çağırın.
gapi.auth2 nesnesi ve ilişkili yöntemler:
gapi.auth2.AuthorizeConfig nesnesi TokenClientConfig veya CodeClientConfig Eskiyi yeniyle değiştirme
gapi.auth2.AuthorizeResponse nesnesi Kaldır
gapi.auth2.AuthResponse nesnesi Kaldır
gapi.auth2.authorize() requestCode() or requestAccessToken() Eskiyi yeniyle değiştirme
gapi.auth2.ClientConfig() TokenClientConfig veya CodeClientConfig Eskiyi yeniyle değiştirme
gapi.auth2.getAuthInstance() Kaldır
gapi.auth2.init() initTokenClient() or initCodeClient() Eskiyi yenisiyle değiştir
gapi.auth2.OfflineAccessOptions 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 öğesinin HTML DOM'de yüklenmesi veya google.accounts.id.renderButton JS çağrısı, kullanıcının Google Hesabı'nda oturum açmasını tetikler.

Örnek kimlik bilgileri

Mevcut kimlik bilgileri

Google ile Oturum Açma platform kitaplığı, JavaScript için Google API İstemci Kitaplığı veya Google Auth 2.0 uç noktalarına yapılan doğrudan çağrılar tek bir yanıtta hem OAuth 2.0 erişim jetonu hem de OpenID Connect kimlik jetonu döndürür.

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:

  • Yetkilendirme için kullanıldığında erişim jetonu:

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

Süresi dolmuş, iptal edilmiş veya geçersiz bir erişim jetonu kullanarak API isteği göndermeye çalışırken Google'dan gelen örnek yanıt:

HTTP Yanıt Üst Bilgileri

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