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

Genel Bakış

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

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

Bu rehberi uygulayarak:

  • kullanımdan kaldırılan Platform Kitaplığı'nı Kimlik Hizmetleri Kitaplığı ile değiştirin ve
  • API istemci kitaplığı kullanıyorsanız kullanımdan kaldırılan gapi.auth2 modülünü, yöntemlerini ve nesnelerini kaldırıp bunların yerine Kimlik Hizmetleri'ndeki eşdeğerlerini ekleyin.

Identity Services JavaScript kitaplığında değişenler hakkında bilgi edinmek için genel bakış ve kullanıcı yetkilendirmesinin işleyiş şekli başlıklı makaleleri inceleyerek temel terimleri ve kavramları gözden geçirin.

Kullanıcı kaydı ve oturum açma için kimlik doğrulama arıyorsanız bunun yerine Google ile Oturum Açma'dan geçiş başlıklı makaleyi inceleyin.

Yetkilendirme akışınızı belirleme

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

Kullanılan yetkilendirme akışının 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ıdır ve arka uç platformu yoktur.
  • Google API'lerini çağırmak için kullanıcının mevcut olması gerekir, uygulamanız yalnızca erişim jetonlarını kullanır ve yenileme jetonları gerektirmez.
  • Web uygulamanız apis.google.com/js/api.js yükleniyor.
  • Uygulamanız İstemci Tarafı Web Uygulamaları için OAuth 2.0'a dayanmaktadı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ı gösteren işaretler:

  • Uygulamanız şu temellere dayanıyor:

  • Uygulamanız hem kullanıcının tarayıcısında hem de arka uç platformunuzda çalışır.

  • Arka uç platformunuzda bir yetkilendirme kodu uç noktası barındırılıyor.

  • Arka uç platformunuz, kullanıcıların mevcut olmasını gerektirmeden (çevrimdışı mod olarak da bilinir) kullanıcılar adına Google API'lerini çağırıyor.

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

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

Bir yetkilendirme akışı seçin

Taşıma işlemine başlamadan önce mevcut akışınızla devam etmenin mi yoksa farklı bir akış kullanmanın mı ihtiyaçlarınızı en iyi şekilde karşılayacağını 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ılara takvimlerinde, fotoğraflarında ve aboneliklerinde yapılan önemli değişiklikleri bildirmek için güncellemeleri getirme gibi yeni çevrimdışı işlevler eklemesini de sağlar.

Seçicileri kullanarak bir yetkilendirme akışı belirleyin.

Örtük akış

Kullanıcı mevcutken tarayıcı içi kullanım için erişim jetonu alma.

Örtülü akış örnekleri, web uygulamalarını Identity Services'e geçişten önce ve sonra gösterir.

Yetkilendirme kodu akışı

Google tarafından verilen kullanıcı başına yetkilendirme kodu, arka uç platformunuza teslim edilir. Burada erişim jetonu ve yenileme jetonu ile değiştirilir.

Yetkilendirme kodu akışı örnekleri, web uygulamalarını kimlik hizmetlerine geçişten önce ve sonra gösterir.

Bu kılavuzda, mevcut işlevleri eklemek, kaldırmak, güncellemek veya değiştirmek için kalın harflerle belirtilen 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 incelenir.

Etkilenen kodu belirleme ve test etme

Hata ayıklama çerezi, etkilenen kodu bulmaya ve kullanımdan kaldırma sonrası davranışı test etmeye yardımcı olabilir.

Büyük veya karmaşık uygulamalarda, gapi.auth2 modülünün desteğinin sonlandırılmasından etkilenen tüm kodları bulmak zor olabilir. Yakında desteği sonlandırılacak işlevlerin 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 kaydetmek için iki nokta üst üste işareti ve ardından bir anahtar değeri ekleyin. Oturum açtıktan sonra, kimlik bilgilerinin alındığını onaylayın veya toplanan günlükleri daha sonra analiz etmek üzere bir arka uca 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, yaptırım tarihinden önce kullanımdan kaldırma sonrası davranışın test edilmesi sağlanır.

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. İsteğe bağlı bir anahtar adı ayarlandığında oturum depolama alanına da kaydedin: informational:key-name.

Kullanıcı etkisini 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. Bu kullanımdan kaldırılan modülü, 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>

auth2 modülünün gapi.load('auth2', function) kullanılarak yüklendiği tüm örnekleri kaldırın.

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

Çerezler

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

Kullanıcı kimlik doğrulamasında çerezlerin nasıl kullanıldığı hakkında ayrıntılı bilgi için Google ile Giriş'ten geçiş, diğer Google ürün ve hizmetlerinde çerezlerin nasıl kullanıldığı hakkında bilgi için Google'ın çerez kullanımı başlıklı makaleyi inceleyin.

Kimlik bilgileri

Google Kimlik Hizmetleri, kullanıcı kimlik doğrulama ve yetkilendirmeyi iki ayrı işlem olarak ele alır ve kullanıcı kimlik bilgileri 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.

Örtük akış

Kullanıcı profili işleme özelliğini yetkilendirme akışlarından kaldırarak kullanıcı kimlik doğrulama ve yetkilendirme işlemlerini ayırın.

Ş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 jetonu olarak ayırır. Bu değişiklik, arka uç platformunuzdan Google OAuth 2.0 uç noktalarına yapılan doğrudan çağrılarla veya platformunuzdaki güvenli bir sunucuda çalışan kitaplıklar (ör. Google APIs Node.js Client) aracılığıyla elde edilen kimlik bilgileri için geçerli değildir.

Oturum durumu

Google ile oturum açma özelliği daha önce, kullanıcıların oturum açma durumunu yönetmenize yardımcı olmak için aşağıdaki yöntemleri kullanıyordu:

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

Ş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ı

Web uygulamanızı, örtülü veya yetkilendirme kodu akışı için bir jeton istemcisi başlatacak şekilde güncelleyin.

Ş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ük akış

initialize a token client 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ışı

initialize a Code Client (Kod İstemcisini Başlatma) bölümündeki örneği izleyerek web uygulamanızı yapılandırmak için bir CodeClientConfig nesnesi ve initCodeClient() çağrısı ekleyin.

Dolaylı akıştan yetkilendirme kodu akışına geçerken:

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

Bir kullanıcı hareketi (ör. düğme tıklama), örtülü akışla doğrudan kullanıcının tarayıcısına veya kullanıcı başına yetkilendirme kodunun erişim jetonu ve yenileme jetonuyla değiştirilmesinin ardından arka uç platformunuza erişim jetonunun döndürülmesine neden olan bir istek oluşturur.

Örtük akış

Erişim jetonları, kullanıcı oturum açmışken ve Google ile etkin bir oturumu varken tarayıcıda alınabilir ve kullanılabilir. Örtülü modda, daha önce istek gönderilmiş 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 UX akışını başlatmak veya mevcut jetonun süresi dolduğunda yeni bir jeton almak üzere requestAccessToken() işlevini çağırmak için bağlantı veya düğme ekleyin.

Kod tabanınızı güncelleyerek:

  • 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 jeton iptal edildiğinde yeni bir jeton isteyin.

Birden fazla kapsamla çalışmak, kod tabanınızda yapısal değişiklikler yapmanızı gerektirebilir. Kapsamlara erişim isteğinde bulunmak için hepsini aynı anda değil, yalnızca gerektiğinde erişim isteğinde bulunmanız gerekir. Bu işleme artımlı yetkilendirme adı verilir. 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 edinmek için kullanıcı rızasını nasıl ele alacağınızı öğrenin.

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 süreci, Google Identity Services kitaplığı tarafından desteklenmez. Web uygulamanız, süresi dolmuş erişim jetonunu algılayacak ve yeni bir jeton isteyecek şekilde güncellenmelidir. Daha fazla bilgi için Jeton işleme bölümüne bakın.

Yetkilendirme kodu akışı

Google'dan yetkilendirme kodu istemek için requestCode()'ı arayacak bir bağlantı veya düğme ekleyin. Örnek için OAuth 2.0 Kod Akışını Tetikleme başlıklı makaleyi inceleyin.

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

Jeton işleme

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

Google API'leri, süresi dolmuş veya iptal edilmiş bir erişim jetonu kullanıldığında 401 Unauthorized HTTP durum kodunu ve invalid_token hata mesajını döndürür. Örnek için Invalid token response (Geçersiz jeton yanıtı) başlıklı makaleyi inceleyin.

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, daha önce verilen izni istediği zaman iptal edebilir. Bunu yaptığınızda mevcut erişim jetonları ve yenileme jetonları geçersiz kılınır. İptal işlemi, revoke() kullanılarak platformunuzdan veya Google Hesabı üzerinden 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 işlevini çağırın.

Web uygulamanız veya arka uç platformunuz bir erişim jetonu istediğinde Google, kullanıcıya bir izin iletişim kutusu gösterir. Google tarafından kullanıcılara gösterilen örnek izin iletişim kutularını inceleyin.

Uygulamanıza erişim jetonu verilmeden önce, kullanıcı onayı istemek ve sonucu kaydetmek için mevcut ve etkin bir Google oturumu gerekir. Mevcut bir oturum zaten oluşturulmamışsa kullanıcının bir 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çma'yı eklemenizi öneririz. Bu işlem aşağıdaki avantajları sunar:

  • Kullanıcının oturum açması gereken zaman sayısını en aza indirir. Erişim jetonu isteğinde bulunulduğunda, etkin bir oturum yoksa Google Hesabı oturum açma işlemi başlatılır.
  • JWT kimlik jetonu credential email alanını, CodeClientConfig veya TokenClientConfig nesnelerindeki login_hint parametresinin değeri olarak doğrudan kullanın. Bu, özellikle platformunuzda kullanıcı hesabı yönetim sistemi yoksa yararlıdır.
  • Google Hesabı'nı platformunuzdaki mevcut bir yerel kullanıcı hesabıyla arayıp ilişkilendirerek platformunuzdaki yinelenen hesap sayısını 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 net bir şekilde ayrılabilir. Bu sayede, gerekli adım sayısı azaltılır ve kullanıcı kaybı oranı iyileştirilir.

Kullanıcılar, oturum açtıktan sonra ve erişim jetonu verilmeden önce istenen kapsamlar için uygulamanıza izin vermelidir.

İzin verildikten sonra, kullanıcı tarafından onaylanan veya reddedilen kapsamların listesiyle birlikte bir erişim jetonu döndürülür.

Ayrıntılı izinler, kullanıcıların kapsamları tek tek onaylamasına veya reddetmesine olanak tanır. Birden fazla kapsam için erişim isteğinde bulunulduğunda her kapsam, diğer kapsamlar bağımsız olarak verilir veya reddedilir. Uygulamanız, kullanıcı tercihlerine göre belirli bir kapsamda olan özellikleri ve işlevleri seçerek etkinleştiriyor.

Örtük 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 Giriş JavaScript istemci referanslarını kaldırın:

Yöntemler:

  • GoogleUser.getAuthResponse()

Bu ayrıntılı izinler örneğini izleyerek 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ı ekleyin veya güncelleyin.

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

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

Örtük akış örnekleri

Eski yöntem

GAPI İstemci Kitaplığı

Kullanıcı izni için pop-up iletişim kutusu kullanılarak tarayıcıda çalışan Google API Client Library for JavaScript örneği.

gapi.auth2 modülü, gapi.client.init() tarafından otomatik olarak yüklenip kullanıldığından gizlenir.

<!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 pop-up iletişim kutusu kullanan, tarayıcıda çalışan istemci 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 Google Cloud console.
    // 'scope' field specifies space-delimited list of access scopes.
    gapi.client.init({
        'apiKey': 'YOUR_API_KEY',
        'clientId': 'YOUR_CLIENT_ID',
        'discoveryDocs': [discoveryUrl],
        'scope': SCOPE
    }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

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

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

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

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

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

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

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

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

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

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

OAuth 2.0 uç noktaları

Kullanıcı izni için Google'a yönlendirmeler kullanarak tarayıcıda çalışan istemci 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 bir 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 yol

Yalnızca GIS

Bu örnekte, yalnızca kullanıcı izni için jeton modelini kullanan Google Kimlik Hizmeti JavaScript kitaplığı ve pop-up iletişim kutusu gösterilmektedir. Bu örnek, bir istemciyi yapılandırmak, erişim jetonu istemek ve almak ve bir Google API'sini çağırmak 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 async/await

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 İstemci Kitaplığı kullanılarak API'nin nasıl çağrılacağı gösterilmektedir.

Kitaplık yükleme sırasını zorunlu kılmak, yetkilendirme hatalarını yakalamak ve yeniden denemek için Promises, async ve await kullanılır. API çağrısı yalnızca geçerli bir erişim jetonu kullanılabilir hale geldikten sonra yapılır.

Kullanıcıların, sayfa ilk yüklendiğinde erişim jetonu eksikse veya erişim jetonunun süresi dolduktan sonra "Takvimi Göster" düğmesine basması beklenir.

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

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

        let tokenClient;
        let libsLoaded = 0;

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

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

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

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

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

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

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

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

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

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

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

GAPI geri çağırması

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 İstemci Kitaplığı kullanılarak 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 Takvimi Göster düğmesine basmaları beklenir.

<!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, yetkilendirme kodunu doğrudan arka uç jeton uç noktanıza döndürmek için URL yönlendirmesi veya yanıtı platformunuza proxy olarak ileten, kullanıcının tarayıcısında çalışan bir JavaScript geri çağırma işleyicisi 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ı

Kullanıcı izni için Google'a yönlendirme kullanan, arka uç platformda çalışan 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. Kullanıcı izni, kullanıcının tarayıcısını Google'a yönlendirerek işlenir.

/\*
 \* 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 yol

GIS Popup UX

Bu örnekte, kullanıcı izni için bir pop-up iletişim kutusu ve Google'dan yetkilendirme kodunu almak için geri çağırma işleyicisi yetkilendirme kodu modelini kullanan yalnızca Google Kimlik Hizmeti JavaScript kitaplığı gösterilmektedir. Bu örnek, bir 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>

GIS yönlendirme kullanıcı deneyimi

Yetkilendirme kodu modeli, platformunuz tarafından barındırılan uç noktaya kullanıcı başına 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österilmektedir:

<!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 yetkilendirmesi için kullanılan tek bir JavaScript kitaplığıdır. Bu kitaplık, birden fazla farklı kitaplık ve modülde bulunan özellikleri ve işlevleri birleştirip bunların yerine geçer:

Kimlik Hizmetleri'ne geçiş yaparken gerçekleştirilecek 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 örtülü akışı izleyin.
apis.google.com/js/client.js accounts.google.com/gsi/client Yeni kitaplık ve yetkilendirme kodu akışı eklendi.

Kitaplık hızlı referansı

Eski Google ile Oturum Açma JavaScript istemci kitaplığı ile yeni Google Kimlik Hizmetleri kitaplığı arasındaki nesne ve yöntem karşılaştırması ve taşıma sırasında yapılması gereken ek bilgiler ve işlemlerle ilgili 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ştirin. İzinler, https://myaccount.google.com/permissions adresinden de iptal edilebilir.
GoogleAuth.grantOfflineAccess() Kaldırmak için yetkilendirme kodu akışını izleyin.
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ştirin. İzinler, https://myaccount.google.com/permissions adresinden de iptal edilebilir.
GoogleUser.getAuthResponse() requestCode() or requestAccessToken() Eskiyi yenisiyle değiştirme
GoogleUser.getBasicProfile() Kaldır'a dokunun. Bunun yerine kimlik jetonunu kullanın. Google ile oturum açma özelliğinden geçiş başlıklı makaleyi inceleyin.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() Eskiyi yenisiyle değiştirme
GoogleUser.getHostedDomain() Kaldır
GoogleUser.getId() Kaldır
GoogleUser.grantOfflineAccess() Kaldırmak için yetkilendirme kodu akışını izleyin.
GoogleUser.grant() Kaldır
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() Eskiyi yenisiyle değiştirme
GoogleUser.isSignedIn() Kaldır
GoogleUser.reloadAuthResponse() requestAccessToken() Eski erişim jetonunu kaldırın, süresi dolmuş veya iptal edilmiş erişim jetonunun yerine yenisini eklemek için yeni erişim jetonunu çağırın.
gapi.auth2 nesnesi ve ilişkili yöntemler:
gapi.auth2.AuthorizeConfig nesnesi TokenClientConfig veya CodeClientConfig Eskiyi yenisiyle değiştirme
gapi.auth2.AuthorizeResponse nesnesi Kaldır
gapi.auth2.AuthResponse nesnesi Kaldır
gapi.auth2.authorize() requestCode() or requestAccessToken() Eskiyi yenisiyle değiştirme
gapi.auth2.ClientConfig() TokenClientConfig veya CodeClientConfig Eskiyi yenisiyle değiştirme
gapi.auth2.getAuthInstance() Kaldır
gapi.auth2.init() initTokenClient() or initCodeClient() Eskiyi yenisiyle değiştirme
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 yüklemesi veya google.accounts.id.renderButton için 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 OAuth 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ığı şu değerleri 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 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 alınan örnek yanıt:

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