İstemci Tarafı Web Uygulamaları için OAuth 2.0

Bu dokümanda, JavaScript web uygulamasından Google API'lerine erişmek için OAuth 2.0 yetkilendirmesinin nasıl uygulanacağı açıklanmaktadır. OAuth 2.0, kullanıcıların kullanıcı adlarını, şifrelerini ve diğer bilgilerini gizli tutarken belirli verileri bir uygulamayla paylaşmasına olanak tanır. Örneğin, bir uygulama, kullanıcıların Google Drive'larında dosya depolamasına izin vermek için OAuth 2.0'ı kullanabilir.

Bu OAuth 2.0 akışına dolaylı hibe akışı denir. API'lere yalnızca kullanıcı uygulamada varken erişen uygulamalar için tasarlanmıştır. Bu uygulamalar gizli bilgileri depolayamaz.

Bu akışta uygulamanız, uygulamanızı tanımlamak için sorgu parametrelerini kullanan bir Google URL'si ve uygulamanın gerektirdiği API erişimi türünü açar. URL'yi geçerli tarayıcı penceresinde veya bir pop-up'ta açabilirsiniz. Kullanıcı, Google ile kimlik doğrulaması yapabilir ve istenen izinleri verebilir. Ardından Google, kullanıcıyı uygulamanıza tekrar yönlendirir. Yönlendirme, uygulamanızın doğrulayıp API istekleri yapmak için kullandığı bir erişim jetonu içerir.

Ön koşullar

Projeniz için API'leri etkinleştirin

Google API'lerini çağıran tüm uygulamaların API Consoleiçinde bu API'leri etkinleştirmesi gerekir.

Projenizde bir API'yi etkinleştirmek için:

  1. Open the API Library içinde Google API Console.
  2. If prompted, select a project, or create a new one.
  3. API Library , mevcut tüm API'leri ürün ailesine ve popülerliğe göre gruplandırılmış olarak listeler. Etkinleştirmek istediğiniz API listede görünmüyorsa API'yi bulmak için aramayı kullanın veya ait olduğu ürün ailesinde Tümünü Görüntüle'yi tıklayın.
  4. Etkinleştirmek istediğiniz API'yi seçip Etkinleştir düğmesini tıklayın.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Yetkilendirme kimlik bilgileri oluşturma

Google API'lerine erişmek için OAuth 2.0 kullanan tüm uygulamaların, uygulamayı Google'ın OAuth 2.0 sunucusuna tanımlayan yetkilendirme kimlik bilgilerine sahip olması gerekir. Aşağıdaki adımlarda projeniz için kimlik bilgilerinin nasıl oluşturulacağı açıklanmaktadır. Sonrasında uygulamalarınız, ilgili proje için etkinleştirdiğiniz API'lere erişmek üzere kimlik bilgilerini kullanabilir.

  1. Go to the Credentials page.
  2. Kimlik bilgisi oluştur > OAuth istemci kimliği seçeneğini tıklayın.
  3. Web uygulaması uygulama türünü seçin.
  4. Formu doldurun. Yetkili Google API istekleri yapmak için JavaScript kullanan uygulamaların yetkilendirilmiş JavaScript kaynaklarını belirtmesi gerekir. Kaynaklar, uygulamanızın OAuth 2.0 sunucusuna istek gönderebileceği alan adlarını tanımlar. Bu kaynaklar Google'ın doğrulama kurallarına uygun olmalıdır.

Erişim kapsamlarını tanımlama

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesine, kullanıcıların uygulamanıza verdiği erişim miktarını kontrol etmesine imkan tanır. Bu nedenle, istenen kapsam sayısı ile kullanıcı izni alma olasılığı arasında ters bir ilişki olabilir.

OAuth 2.0 yetkilendirmesini uygulamaya başlamadan önce uygulamanızın erişmesi için izin alması gereken kapsamları belirlemenizi öneririz.

OAuth 2.0 API Kapsamları belgesinde, Google API'lerine erişmek için kullanabileceğiniz kapsamların tam listesi bulunmaktadır.

OAuth 2.0 erişim jetonları edinme

Aşağıdaki adımlarda, kullanıcı adına API isteği gerçekleştirmek için uygulamanızın Google'ın OAuth 2.0 sunucusuyla nasıl etkileşime girdiği gösterilir. Uygulamanızın, kullanıcı yetkilendirmesi gerektiren bir Google API isteğini yürütebilmesi için önce bu izne sahip olması gerekir.

1. Adım: İstemci nesnesini yapılandırın

OAuth 2.0 akışını işlemek amacıyla JavaScript için Google API'leri istemci kitaplığını kullanıyorsanız ilk adımınız gapi.auth2 ve gapi.client nesnelerini yapılandırmaktır. Bu nesneler, uygulamanızın kullanıcı yetkilendirmesi almasını ve yetkili API isteklerinde bulunmasını sağlar.

İstemci nesnesi, uygulamanızın erişim izni istediği kapsamları tanımlar. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını belirtir.

JS İstemci Kitaplığı

JavaScript istemci kitaplığı, yetkilendirme işleminin çeşitli yönlerini basitleştirir:

  1. Google'ın yetkilendirme sunucusu için yönlendirme URL'si oluşturur ve kullanıcıyı bu URL'ye yönlendirmek için bir yöntem sunar.
  2. Bu sunucudan uygulamanıza yönlendirmeyi işler.
  3. Yetkilendirme sunucusu tarafından döndürülen erişim jetonunu doğrular.
  4. Yetkilendirme sunucusunun uygulamanıza gönderdiği erişim jetonunu depolar ve uygulamanız daha sonra yetkilendirilmiş API çağrıları yaptığında jetonu alır.

Aşağıdaki kod snippet'i, bu dokümanın ilerleyen kısımlarında gösterilen tam örnekten bir alıntıdır. Bu kod, uygulamanızın daha sonra API çağrıları yapmak için kullanacağı gapi.client nesnesini başlatır. Bu nesne oluşturulduğunda, uygulamanızın kullanıcının yetkilendirme durumunu kontrol etmek ve izlemek için kullandığı gapi.auth2 nesnesi de başlatılır.

gapi.client.init çağrısı, aşağıdaki alanları belirtir:

  • apiKey ve clientId değerleri, uygulamanızın yetkilendirme kimlik bilgilerini belirtir. Yetkilendirme kimlik bilgileri oluşturma bölümünde açıklandığı gibi bu değerler API Consolebölümünde bulunabilir. Uygulamanız yetkili API isteklerinde bulunduğunda clientId öğesinin zorunlu olduğunu unutmayın. Yalnızca yetkisiz istek yapan uygulamalar sadece bir API anahtarı belirtebilir.
  • scope alanı, uygulamanızın kullanıcı adına erişebileceği kaynaklara karşılık gelen erişim kapsamlarının boşlukla ayrılmış bir listesini belirtir. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını belirtir.

    Uygulamanızın, yetkilendirme kapsamlarına mümkün olduğunca erişim izni istemesini öneririz. Artımlı yetkilendirme yoluyla kullanıcı verilerine bağlam içinde erişim isteyerek, kullanıcıların uygulamanızın neden erişim iznine ihtiyaç duyduğunu daha kolay anlamalarına yardımcı olursunuz.

  • discoveryDocs alanı, uygulamanızın kullandığı API Discovery dokümanlarının listesini tanımlar. Keşif dokümanı, bir API'nin kaynak şemaları da dahil olmak üzere yüzeyini açıklar ve JavaScript istemci kitaplığı, bu bilgileri uygulamaların kullanabileceği yöntemler oluşturmak için kullanır. Bu örnekte kod, Google Drive API'nın 3. sürümü için keşif dokümanını alır.

gapi.client.init çağrısı tamamlandıktan sonra kod, Google Auth nesnesini tanımlamak için GoogleAuth değişkenini ayarlar. Son olarak kod, kullanıcının oturum açma durumu değiştiğinde bir işlev çağıran bir işleyici ayarlar. (Bu işlev, snippet'te tanımlanmaz.)

var GoogleAuth; // Google Auth object.
function initClient() {
  gapi.client.init({
      'apiKey': 'YOUR_API_KEY',
      'clientId': 'YOUR_CLIENT_ID',
      'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
      'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/drive/v3/rest']
  }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

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

OAuth 2.0 Uç Noktalar

Doğrudan OAuth 2.0 uç noktalarına erişiyorsanız bir sonraki adıma geçebilirsiniz.

2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendirin

Bir kullanıcının verilerine erişim izni istemek için kullanıcıyı Google'ın OAuth 2.0 sunucusuna yönlendirin.

JS İstemci Kitaplığı

Kullanıcıyı Google'ın yetkilendirme sunucusuna yönlendirmek için GoogleAuth.signIn() yöntemini kullanın.

GoogleAuth.signIn();

Uygulamada, API çağrısı yapılmadan önce signIn() yönteminin çağrılıp çağrılmadığını belirlemek için uygulamanız bir Boole değeri ayarlayabilir.

Aşağıdaki kod snippet'i, kullanıcı yetkilendirme akışını nasıl başlatacağınızı gösterir. Snippet ile ilgili aşağıdaki noktalara dikkat edin:

  • Kodda başvurulan GoogleAuth nesnesi, 1. adımdaki kod snippet'inde tanımlanan genel değişkenle aynıdır.

  • updateSigninStatus işlevi, kullanıcının yetkilendirme durumunda yapılan değişiklikleri işleyen bir dinleyicidir. Dinleyici olarak rolü, 1. adımdaki kod snippet'inde de tanımlandı:
    GoogleAuth.isSignedIn.listen(updateSigninStatus);
  • Snippet iki ek genel değişken tanımlar:

    • isAuthorized, kullanıcının zaten oturum açmış olup olmadığını gösteren boole değişkenidir. Bu değer, uygulama yüklendiğinde ayarlanabilir ve kullanıcı uygulamada oturum açar veya oturumu kapatırsa ayarlanabilir.

      Bu snippet'te sendAuthorizedApiRequest işlevi, uygulamanın yetkilendirme gerektiren bir API isteğini deneyip denemeyeceğini veya kullanıcıdan uygulamayı yetkilendirmesini isteyip istemediğini belirlemek için değişken's değerini kontrol eder.

    • currentApiRequest, kullanıcının denediğiniz son API isteğiyle ilgili ayrıntıları depolayan bir nesnedir. Nesnenin değeri, uygulama sendAuthorizedApiRequest işlevini çağırdığında ayarlanır.

      Kullanıcı uygulamayı yetkilendirdiyse istek hemen çalıştırılır. Aksi takdirde işlev, kullanıcıyı oturum açmaya yönlendirir. Kullanıcı oturum açtıktan sonra updateSignInStatus işlevi, yetkilendirme akışı başlamadan önce yapılmaya çalışılan isteği ileterek sendAuthorizedApiRequest çağrısı yapar.

var isAuthorized;
var currentApiRequest;

/**
 * Store the request details. Then check to determine whether the user
 * has authorized the application.
 *   - If the user has granted access, make the API request.
 *   - If the user has not granted access, initiate the sign-in flow.
 */
function sendAuthorizedApiRequest(requestDetails) {
  currentApiRequest = requestDetails;
  if (isAuthorized) {
    // Make API request
    // gapi.client.request(requestDetails)

    // Reset currentApiRequest variable.
    currentApiRequest = {};
  } else {
    GoogleAuth.signIn();
  }
}

/**
 * Listener called when user completes auth flow. If the currentApiRequest
 * variable is set, then the user was prompted to authorize the application
 * before the request executed. In that case, proceed with that API request.
 */
function updateSigninStatus(isSignedIn) {
  if (isSignedIn) {
    isAuthorized = true;
    if (currentApiRequest) {
      sendAuthorizedApiRequest(currentApiRequest);
    }
  } else {
    isAuthorized = false;
  }
}

OAuth 2.0 Uç Noktalar

Google'ın OAuth 2.0 uç noktasından erişim isteğinde bulunmak için https://accounts.google.com/o/oauth2/v2/auth adresinde bir URL oluşturun. Bu uç noktaya HTTPS üzerinden erişilebilir. Düz HTTP bağlantıları reddedilir.

Google yetkilendirme sunucusu, web sunucusu uygulamaları için aşağıdaki sorgu dizesi parametrelerini destekler:

Parametreler
client_id Zorunlu

Uygulamanızın istemci kimliği. Bu değeri API Console Credentials pagebölümünde bulabilirsiniz.

redirect_uri Zorunlu

Kullanıcı, yetkilendirme akışını tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendireceğini belirler. Bu değerin, müşterinizin API ConsoleCredentials pageiçinde yapılandırdığınız OAuth 2.0 istemcisi için yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmesi gerekir. Bu değer, sağlanan client_id için yetkili yönlendirme URI'si ile eşleşmezse redirect_uri_mismatch hatası alırsınız.

http veya https şeması, büyük/küçük harf ve sondaki eğik çizginin ('/') eşleşmesi gerektiğini unutmayın.

response_type Zorunlu

JavaScript uygulamaları, parametre değerini token olarak ayarlamalıdır. Bu değer, Google Yetkilendirme Sunucusu'na kullanıcının yetkilendirme işlemini tamamladıktan sonra yönlendirildiği URI'nin (#) parça tanımlayıcısında bir name=value çifti olarak erişim jetonunu döndürmesini bildirir.

scope Zorunlu

Uygulamanızın, kullanıcı adına erişebileceği kaynakları tanımlayan boşlukla sınırlandırılmış bir kapsam listesi. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını belirtir.

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesine olanak tanırken kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol edebilmelerini sağlar. Bu nedenle, istenen kapsam sayısı ile kullanıcı izni alma olasılığı arasında ters bir ilişki vardır.

Uygulamanızın, yetkilendirme kapsamlarına mümkün olduğunca erişim izni istemesini öneririz. Artımlı yetkilendirme yoluyla kullanıcı verilerine bağlam içinde erişim isteyerek, uygulamanızın istediği erişimi neden istediğini daha kolay anlamasına yardımcı olursunuz.

state Önerilen

Yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasında durumu korumak için uygulamanızın kullandığı tüm dize değerlerini belirtir. Sunucu, kullanıcının uygulamanızın erişim isteğine izin vermesinden veya reddetmesinden sonra redirect_uri öğesinin URL parça tanımlayıcısında (#) name=value çifti olarak gönderdiğiniz tam değeri döndürür.

Bu parametreyi, kullanıcıyı uygulamanızda doğru kaynağa yönlendirmek, nonce göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlarla kullanabilirsiniz. redirect_uri tahmininiz olduğundan, state değeri kullanmak gelen bir bağlantının bir kimlik doğrulama isteği sonucunda gerçekleştiğine dair güvencenizi artırabilir. Rastgele bir dize oluşturur veya bir çerezin ya da istemcinin durumunu yakalayan başka bir değerin karmasını kodlarsanız, isteğin doğrulandığından ve istek ile yanıtın aynı tarayıcıdan geldiğinden emin olmak için yanıtı doğrulayabilirsiniz. Bu şekilde, siteler arası istek sahtekarlığı gibi saldırılara karşı koruma sağlanır. state jetonu oluşturma ve onaylamayla ilgili bir örnek için OpenID Connect dokümanlarına bakın.

include_granted_scopes İsteğe bağlı

Uygulamaların, bağlam dahilinde ek kapsamlara erişim istemek için ek yetkilendirme kullanmasını sağlar. Bu parametrenin değerini true olarak ayarlarsanız ve yetkilendirme isteği verildiyse yeni erişim jetonu, kullanıcının daha önce uygulama erişimi verdiği tüm kapsamları da kapsar. Örnekler için ek yetkilendirme bölümüne bakın.

login_hint İsteğe bağlı

Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını bilirse Google Kimlik Doğrulama Sunucusu'na ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için ipucunu kullanır.

Parametre değerini, kullanıcının Google kimliğine eşdeğer bir e-posta adresi veya sub tanımlayıcısı olarak ayarlayın.

prompt İsteğe bağlı

Kullanıcıya sunmak için boşlukla sınırlandırılmış, büyük/küçük harfe duyarlı bir istem listesi. Bu parametreyi belirtmezseniz kullanıcıdan yalnızca projenizin ilk erişim isteği göndermesi istenir. Daha fazla bilgi için Yeniden izin isteme bölümünü inceleyin.

Olası değerler:

none Kimlik doğrulama veya izin ekranları gösterme. Diğer değerlerle belirtilmemelidir.
consent Kullanıcıdan izin isteyin.
select_account Kullanıcıdan bir hesap seçmesini isteyin.

Google yetkilendirme sunucusuna örnek yönlendirme

Aşağıda, satır sonları ve okunabilirlik boşlukları içeren bir URL örneği gösterilmektedir.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

İstek URL'sini oluşturduktan sonra kullanıcıyı bu URL'ye yönlendirin.

JavaScript örnek kodu

Aşağıdaki JavaScript snippet'i, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'te yetkilendirme akışının nasıl başlatılacağını gösterir. Bu OAuth 2.0 uç noktası, Merkezler Arası Kaynak Paylaşımı'nı (CORS) desteklemediğinden snippet, isteği bu uç noktaya açan bir form oluşturur.

/*
 * 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 <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_REDIRECT_URI',
                '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();
}

3. Adım: Google, kullanıcıdan izin ister

Bu adımda kullanıcı, uygulamanıza istenen erişimi verip vermemeye karar verir. Google, bu aşamada, uygulamanızın adını ve kullanıcının yetkilendirme kimlik bilgileriyle erişim izni istediği Google API hizmetlerini ve verilecek erişim kapsamlarının özetini gösteren bir izin penceresi görüntüler. Daha sonra kullanıcı, uygulamanız tarafından istenen bir veya daha fazla kapsama erişim izni verebilir ya da isteği reddedebilir.

Google’ın OAuth 2.0 sunucusundan gelen yanıtın o erişim için izin verilip verilmediğini beklediğinden, uygulamanızın bu aşamada herhangi bir işlem yapması gerekmez. Bu yanıt sonraki adımda açıklanmıştır.

Hatalar

Google'ın OAuth 2.0 yetkilendirme uç noktasına yapılan istekler, beklenen kimlik doğrulama ve yetkilendirme akışları yerine kullanıcıya yönelik hata mesajları gösterebilir. Sık karşılaşılan hata kodları ve önerilen çözünürlükler aşağıda listelenmiştir.

admin_policy_enforced

Google Hesabı, Google Workspace yöneticisinin politikaları nedeniyle istenen bir veya daha fazla kapsamı yetkilendiremiyor. Bir yöneticinin OAuth istemci kimliğinize açıkça izin verilene kadar tüm kapsamlara veya hassas ve kısıtlanmış kapsamlara erişimi nasıl kısıtlayabileceği hakkında daha fazla bilgi için Google Workspace Yöneticisi yardım makalesine bakın. Hangi dahili uygulamaların Google Workspace verilerine erişebileceğini kontrol edin.

disallowed_useragent

Yetkilendirme uç noktası, Google'ın OAuth 2.0 Politikaları tarafından izin verilmeyen yerleşik bir kullanıcı aracısının içinde görüntülenir.

Android

Android geliştiricileri, android.webkit.WebView'te yetkilendirme istekleri açıldığında bu hata mesajıyla karşılaşabilir. Geliştiriciler bunun yerine Android için Google ile Oturum Açma veya OpenID Foundation & Android için AppAuth gibi Android kitaplıklarını kullanmalıdır.

Bir Android uygulaması, yerleştirilmiş kullanıcı aracısında genel bir web bağlantısı açtığında ve bir kullanıcı sitenizden Google’ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde web geliştiricileri bu hatayla karşılaşabilir. Geliştiriciler, işletim sisteminin varsayılan bağlantı işleyicisinde genel bağlantıların açılmasına izin vermelidir. Bu bağlantı hem Android Uygulama Bağlantıları işleyicilerini hem de varsayılan tarayıcı uygulamasını içerir. Android Özel Sekmeleri kitaplığı da desteklenen bir seçenektir.

iOS

iOS ve macOS geliştiricileri, WKWebView'te yetkilendirme istekleri açıldığında bu hatayla karşılaşabilir. Geliştiriciler bunun yerine iOS için Google ile Oturum Açma veya OpenID Foundation & iOS için AppAuth gibi iOS kitaplıklarını kullanmalıdır.

Bir iOS veya macOS uygulaması, yerleştirilmiş bir kullanıcı aracısında genel web bağlantısı açtığında ve kullanıcı sitenizden Google’ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde web geliştiricileri bu hatayla karşılaşabilir. Geliştiriciler, işletim sisteminin varsayılan bağlantı işleyicisinde genel bağlantıların açılmasına izin vermelidir. Bu bağlantı hem Geçiş Bağlantıları işleyicilerini hem de varsayılan tarayıcı uygulamasını içerir. SFSafariViewController kitaplığı da desteklenen bir seçenektir.

org_internal

İstekteki OAuth istemci kimliği, belirli bir Google Cloud Kuruluşundaki Google Hesaplarına erişimi sınırlayan bir projenin parçasıdır. Bu yapılandırma seçeneği hakkında daha fazla bilgi için OAuth kullanıcı rızası ekranını ayarlama yardım makalesindeki Kullanıcı türü bölümünü inceleyin.

origin_mismatch

Yetkilendirme isteğinde bulunan JavaScript'in şema, alan ve/veya bağlantı noktası, OAuth istemci kimliği için kaydedilmiş yetkili bir JavaScript kaynak URI'si ile eşleşmeyebilir. Yetki verilen JavaScript kaynaklarını Google API Console Credentials pageiçinde inceleyin.

redirect_uri_mismatch

Yetkilendirme isteğinde iletilen redirect_uri, OAuth istemci kimliği için yetkilendirilmiş bir yönlendirme URI'si ile eşleşmiyor. Google API Console Credentials pageiçindeki yetkili yönlendirme URI'larını inceleyin.

Yetkilendirme isteğinde bulunan JavaScript'in şema, alan ve/veya bağlantı noktası, OAuth istemci kimliği için kaydedilmiş yetkili bir JavaScript kaynak URI'si ile eşleşmeyebilir. Yetki verilen JavaScript kaynaklarını Google API Console Credentials pageiçinde inceleyebilirsiniz.

4. Adım: OAuth 2.0 sunucu yanıtını işleyin

JS İstemci Kitaplığı

JavaScript istemci kitaplığı, Google'ın yetkilendirme sunucusundan gelen yanıtı işler. Mevcut kullanıcının oturum açma durumundaki değişiklikleri izlemek için bir dinleyici ayarlarsanız bu işlev, kullanıcı uygulamaya istenen erişim iznini verdiğinde çağrılır.

OAuth 2.0 Uç Noktalar

OAuth 2.0 sunucusu, erişim jetonu isteğinizde belirtilen redirect_uri öğesine yanıt gönderir.

Kullanıcı isteği onaylarsa yanıt bir erişim jetonu içerir. Kullanıcı isteği onaylamazsa yanıtta bir hata mesajı bulunur. Erişim jetonu veya hata mesajı, aşağıda gösterildiği gibi yönlendirme URI'sinin karma parçasında döndürülür:

  • Erişim jetonu yanıtı:

    https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600

    Parça dizesi, access_token parametresine ek olarak, her zaman Bearer olarak ayarlanan token_type parametresini ve saniye cinsinden jetonun kullanım ömrünü belirten expires_in parametresini de içerir. Erişim jetonu isteğinde state parametresi belirtildiyse değeri de yanıta eklenir.

  • Hata yanıtı:
    https://oauth2.example.com/callback#error=access_denied

OAuth 2.0 sunucusu yanıtı örneği

Bu akışı, Google Drive'ınızdaki dosyaların meta verilerini görüntülemek için salt okuma erişimi isteyen aşağıdaki örnek URL'yi tıklayarak test edebilirsiniz:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 include_granted_scopes=true&
 response_type=token&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

OAuth 2.0 akışını tamamladıktan sonra http://localhost/oauth2callback adresine yönlendirilirsiniz. Yerel makineniz bu adreste dosya sunmazsa söz konusu URL, 404 NOT FOUND hatası verir. Bir sonraki adımda, kullanıcı uygulamanıza tekrar yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha fazla ayrıntı sağlanmaktadır.

Google API'lerini çağırma

JS İstemci Kitaplığı

Uygulamanız bir erişim jetonu aldıktan sonra, API'yi kullanıcı adına yapmak için JavaScript istemci kitaplığını kullanabilirsiniz. İstemci jetonu erişim jetonunu sizin için yönetir ve jetonda özel bir şey göndermeniz gerekmez.

İstemci kitaplığı, API yöntemlerini çağırmanın iki yolunu destekler. Bir keşif dokümanı yüklediyseniz API sizin için yönteme özel işlevler tanımlar. API yöntemini çağırmak için gapi.client.request işlevini de kullanabilirsiniz. Aşağıdaki iki snippet, Drive API\about.get3 yöntemi için bu seçenekleri göstermektedir.

// Example 1: Use method-specific function
var request = gapi.client.drive.about.get({'fields': 'user'});

// Execute the API request.
request.execute(function(response) {
  console.log(response);
});


// Example 2: Use gapi.client.request(args) function
var request = gapi.client.request({
  'method': 'GET',
  'path': '/drive/v3/about',
  'params': {'fields': 'user'}
});
// Execute the API request.
request.execute(function(response) {
  console.log(response);
});

OAuth 2.0 Uç Noktalar

Uygulamanız bir erişim jetonu aldıktan sonra, API'nin gerektirdiği erişim kapsamları sağlandıysa belirli bir kullanıcı hesabı adına bir Google API'sine çağrı yapmak için bu jetonu kullanabilirsiniz. Bunu yapmak için erişim isteğini bir access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API isteğine ekleyin. Sorgu dizeleri sunucu günlüklerinde görünür olduğu için mümkün olduğunda HTTP üstbilgisi tercih edilir. Çoğu durumda, Google API'lerine çağrılarınızı ayarlamak için bir istemci kitaplığı kullanabilirsiniz (örneğin, Drive Files API'yi çağırırken).

OAuth 2.0 Playground'da tüm Google API'lerini deneyebilir ve kapsamlarını görüntüleyebilirsiniz.

HTTP GET örnekleri

Authorization: Bearer HTTP üst bilgisini kullanarak drive.files uç noktasına (Drive Files API) yapılan çağrı aşağıdaki gibi görünebilir. Kendi erişim jetonunuzu belirtmeniz gerektiğini unutmayın:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

access_token sorgu dizesi parametresini kullanarak kimliği doğrulanmış kullanıcı için aynı API'ye yapılan bir aramayı burada görebilirsiniz:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl örnekleri

Bu komutları curl komut satırı uygulamasıyla test edebilirsiniz. HTTP üst bilgisi seçeneğini kullanan bir örnek (tercih edilir):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

Alternatif olarak, sorgu dizesi parametre seçeneği:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

JavaScript örnek kodu

Aşağıdaki kod snippet'i, bir Google API'sine istek göndermek için CORS'nin (Kaynaklar arası kaynak paylaşımı) nasıl kullanılacağını gösterir. Bu örnek, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmaz. Ancak, istemci kitaplığını kullanmıyor olsanız bile o kitaplığın dokümanlarındaki CORS destek kılavuzu, bu istekleri daha iyi anlamanıza yardımcı olacaktır.

Bu kod snippet'indeki access_token değişkeni, yetkili kullanıcı adına API isteğinde bulunmak için aldığınız jetonu temsil eder. Tam örnekte, bu jetonun tarayıcının yerel depolama alanında nasıl depolanacağı ve bir API isteği yapılırken nasıl alınacağı gösterilmektedir.

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) {
  console.log(xhr.response);
};
xhr.send(null);

Tam örnek

JS İstemci Kitaplığı

Örnek kod demosu

Bu bölümde, kodun gerçek bir uygulamada nasıl davrandığını gösteren, aşağıdaki kod örneğinin çalışan bir demosu yer almaktadır. Uygulamayı yetkilendirdikten sonra, uygulama Google Hesabınıza bağlı uygulamalarda listelenir. Uygulamanın adı Google API Dokümanları için OAuth 2.0 Demo'dur. Benzer şekilde, erişimi iptal edip sayfayı yenilerseniz o uygulama artık listelenmez.

Bu uygulamanın, https://www.googleapis.com/auth/drive.metadata.readonly kapsamına erişim istediğini unutmayın. Erişim, yalnızca JavaScript uygulamasında OAuth 2.0 akışının nasıl başlatılacağını göstermek için istenir. Bu uygulama hiçbir API isteğinde bulunmaz.

JavaScript örnek kodu

Yukarıda gösterildiği gibi, bu kod örneği, JavaScript için Google API'leri İstemci Kitaplığı'nı yükleyip OAuth 2.0 akışını başlatan bir sayfaya (uygulamaya) yöneliktir. Sayfada şunlardan biri gösterilir:

  • Kullanıcının uygulamada oturum açmasına olanak tanıyan bir düğme. Kullanıcı daha önce uygulamayı yetkilendirmediyse uygulama OAuth 2.0 akışını başlatır.
  • Kullanıcının uygulamada oturumunu kapatmasına veya uygulamaya önceden verilen erişimi iptal etmesine olanak sağlayan iki düğme. Bir uygulamanın oturumunu kapatırsanız uygulamaya verilen erişimi iptal etmediniz. Uygulamanın sizin adınıza başka yetkilendirilmiş isteklerde bulunabilmesi için tekrar oturum açmanız gerekir, ancak uygulamayı tekrar kullandığınızda tekrar erişim izni vermeniz gerekmez.

Ayrıca, Google Hesabınızın İzinler sayfasından uygulamaya erişimi iptal edebilirsiniz. Uygulama Google API Dokümanlar için OAuth 2.0 Demo olarak listelenir.

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

OAuth 2.0 Uç Noktalar

Bu kod örneği, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'te OAuth 2.0 akışını nasıl tamamlayacağınızı gösterir. Kod, API isteği denemek için kullanılan bir düğmeyi görüntüleyen HTML sayfası içindir. Düğmeyi tıklarsanız kod, sayfanın tarayıcınızın yerel depolama alanında bir API erişim jetonu depolayıp depolamadığını kontrol eder. Bu durumda API isteğini yürütür. Aksi takdirde OAuth 2.0 akışı başlatılır.

OAuth 2.0 akışı için sayfa şu adımları izler:

  1. Kullanıcıyı, Google'ın https://www.googleapis.com/auth/drive.metadata.readonly kapsamına erişim isteyen OAuth 2.0 sunucusuna yönlendirir.
  2. İstenen bir veya daha fazla kapsam için erişim izni verdikten (veya reddettikten) sonra kullanıcı, erişim jetonunu parça tanımlayıcı dizesinden ayrıştıran orijinal sayfaya yönlendirilir.
  3. Sayfa, örnek API isteğinde bulunmak için erişim jetonunu kullanır.

    API isteği, yetkili kullanıcının Google Drive hesabıyla ilgili bilgileri almak için Drive API'nin about.get yöntemini çağırır.

  4. İstek başarıyla yürütülürse API yanıtı tarayıcının hata ayıklama konsoluna kaydedilir.

Uygulamaya erişim iznini, Google Hesabınızın İzinler sayfasından iptal edebilirsiniz. Uygulama Google API Dokümanları için OAuth 2.0 Demo olarak listelenir.

Bu kodu yerel olarak çalıştırmak için yetkilendirme kimlik bilgilerinize karşılık gelen YOUR_CLIENT_ID ve YOUR_REDIRECT_URI değişkenlerinin değerlerini ayarlamanız gerekir. YOUR_REDIRECT_URI değişkeni, sayfanın sunulmakta olduğu aynı URL'ye ayarlanmalıdır. Bu değer, API Console Credentials pageiçinde yapılandırdığınız OAuth 2.0 istemcisi için yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu değer yetkili bir URI ile eşleşmezse redirect_uri_mismatch hatası alırsınız. Projenizin bu istek için uygun API'yi de etkinleştirmiş olması gerekir.

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

JavaScript kaynak doğrulama kuralları

Google, geliştiricilerin uygulamalarını güvende tutmalarına yardımcı olmak için JavaScript kaynaklarına aşağıdaki doğrulama kurallarını uygular. JavaScript kaynaklarınız bu kurallara uygun olmalıdır. Alan, barındırıcı ve şemanın tanımı için RFC 3986'nın 3. bölümüne bakın.

Doğrulama kuralları
Şema

JavaScript kaynakları, düz HTTP değil, HTTPS şemasını kullanmalıdır. Localhost URI'ları (localhost IP adresi URI'leri dahil) bu kuraldan muaftır.

Ana makine

Ana makineler ham IP adresleri olamaz. Localhost IP adresleri bu kuraldan muaftır.

Alan
  • Ana makine TLD'leri (Üst Düzey Alanlar) herkese açık son ek listesine ait olmalıdır.
  • Ana makine alanları “googleusercontent.com” olamaz.
  • JavaScript kaynakları, uygulamanın sahibi olmadığı sürece URL kısaltıcı alan adları (ör. goo.gl) içeremez.
  • Kullanıcı Bilgileri

    JavaScript kaynakları, kullanıcı bilgileri alt bileşenini içeremez.

    Yol

    JavaScript kaynakları, yol bileşenini içeremez.

    Sorgu

    JavaScript kaynakları, sorgu bileşenini içeremez.

    Parça

    JavaScript kaynakları, parça bileşenini içeremez.

    Karakterler JavaScript kaynakları, aşağıdakiler gibi belirli karakterleri içeremez:
    • Joker karakter ('*')
    • Yazdırılamayan ASCII karakterler
    • Geçersiz yüzde kodlamaları (yüzde işaretinden sonra iki on altılık basamak içeren URL kodlama biçimine uymayan yüzde kodlaması)
    • Boş karakterler (kodlanmış NULL karakteri, ör. %00, %C0%80)

    Artımlı yetkilendirme

    OAuth 2.0 protokolünde, uygulamanız kapsamlar tarafından tanımlanan kaynaklara erişmek için yetkilendirme ister. Kaynaklara ihtiyaç duyduğunuz anda yetkilendirme istemek en iyi kullanıcı deneyimi uygulamaları olarak kabul edilir. Bu uygulamanın etkinleştirilmesi için Google'ın yetkilendirme sunucusu artımlı yetkilendirmeyi destekler. Bu özellik, gerektiğinde kapsamları istemenize olanak tanır ve kullanıcı yeni kapsam için izin verirse kullanıcının proje için verdiği tüm kapsamları içeren bir jetonla değiştirilebilecek bir yetkilendirme kodu döndürür.

    Örneğin, kullanıcıların müzik parçalarını örneklemelerine ve mix'ler oluşturmalarına olanak tanıyan bir oturum açma sırasında çok az kaynak gerekebilir. Bu, oturum açan kişinin adından başka bir şey olabilir. Ancak, tamamlanan bir mix'in kaydedilmesi için kullanıcının Google Drive'ına erişmesi gerekir. Çoğu kullanıcı, yalnızca uygulamanın gerçekten ihtiyaç duyduğu anda Google Drive'larına erişmeleri istenirse bu uygulamaları doğal bulurlar.

    Bu durumda uygulama, oturum açma sırasında temel oturum açma işlemi için openid ve profile kapsamlarını isteyebilir, ardından ilk isteğin birleştiği andan itibaren https://www.googleapis.com/auth/drive.file kapsamının sağlanmasını isteyebilir.

    Ek kurallarla elde edilen erişim jetonları için aşağıdaki kurallar geçerlidir:

    • Jeton, yeni ve birleştirilmiş yetkilendirmeye dahil edilen kapsamlardan herhangi birine karşılık gelen kaynaklara erişmek için kullanılabilir.
    • Bir erişim jetonu almak üzere birleştirilmiş yetkilendirme için yenileme jetonunu kullandığınızda, erişim jetonu birleştirilmiş yetkilendirmeyi temsil eder ve yanıtta bulunan scope değerlerinden herhangi biri için kullanılabilir.
    • Birleştirilmiş yetkilendirme, farklı istemcilerden erişim izni istenmiş olsa bile kullanıcının API projesine verdiği tüm kapsamları içerir. Örneğin, bir kullanıcı bir uygulamanın masaüstü istemcisini kullanarak bir kapsama erişim izni verdiyse ve daha sonra mobil istemci üzerinden aynı uygulamaya başka bir kapsam verirse, birleştirilmiş yetkilendirme her iki kapsamı da içerir.
    • Birleştirilmiş yetkilendirmeyi temsil eden bir jetonu iptal ederseniz ilişkili kullanıcı adına bu yetkilendirmenin tüm kapsamlarına erişim aynı anda iptal edilir.

    Aşağıdaki kod örnekleri, mevcut bir erişim jetonuna kapsamların nasıl ekleneceğini gösterir. Bu yaklaşım, uygulamanızın birden fazla erişim jetonunu yönetmek zorunda kalmamasını sağlar.

    JS İstemci Kitaplığı

    Mevcut bir erişim jetonuna kapsam eklemek için GoogleUser.grant(options) yöntemini çağırın. options nesnesi, erişim izni vermek istediğiniz ek kapsamları tanımlar.

    // Space-separated list of additional scope(s) you are requesting access to.
    // This code adds read-only access to the user's calendars via the Calendar API.
    var NEW_SCOPES = 'https://www.googleapis.com/auth/calendar.readonly';
    
    // Retrieve the GoogleUser object for the current user.
    var GoogleUser = GoogleAuth.currentUser.get();
    GoogleUser.grant({'scope': NEW_SCOPES});

    OAuth 2.0 Uç Noktalar

    Mevcut bir erişim jetonuna kapsam eklemek için Google'ın OAuth 2.0 sunucusuna isteğinize include_granted_scopes parametresini ekleyin.

    Aşağıdaki kod snippet'i bunun nasıl yapılacağını göstermektedir. Snippet, tarayıcının yerel depolama alanında erişim jetonunuzun geçerli olduğu kapsamları depoladığınızı varsayar. (Tam örnek kodu, tarayıcının yerel depolama alanında oauth2-test-params.scope özelliğini ayarlayarak erişim jetonunun geçerli olduğu kapsamların listesini saklar.)

    Snippet, erişim jetonunun geçerli olduğu kapsamları belirli bir sorgu için kullanmak istediğiniz kapsamla karşılaştırır. Erişim jetonu bu kapsamı kapsamıyorsa OAuth 2.0 akışı başlar. Burada oauth2SignIn işlevi, 2. adımda sağlanan işlevle (ve daha sonra tam örnekte sağlanan) aynıdır.

    var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    
    var current_scope_granted = false;
    if (params.hasOwnProperty('scope')) {
      var scopes = params['scope'].split(' ');
      for (var s = 0; s < scopes.length; s++) {
        if (SCOPE == scopes[s]) {
          current_scope_granted = true;
        }
      }
    }
    
    if (!current_scope_granted) {
      oauth2SignIn(); // This function is defined elsewhere in this document.
    } else {
      // Since you already have access, you can proceed with the API request.
    }

    Jeton iptal ediliyor

    Bazı durumlarda, bir kullanıcı bir uygulamaya verilen erişimi iptal etmek isteyebilir. Kullanıcı, Hesap Ayarları sayfasını ziyaret ederek erişimi iptal edebilir. Daha fazla bilgi için Üçüncü taraf sitelerin &site erişimini kaldırma ve hesabınıza erişimi olan uygulamalar destek bölümüne bakın.

    Bir uygulama kendisine verilen erişimi programlı bir şekilde iptal etmek de mümkündür. Kullanıcının abonelikten çıktığı, uygulamaları kaldırdığı veya uygulama için gereken API kaynaklarının önemli ölçüde değiştiği durumlarda programatik iptal önemlidir. Diğer bir deyişle, kaldırma işleminin bir parçası, daha önce uygulamaya verilen izinlerin kaldırılmasını sağlamak için bir API isteği içerebilir.

    JS İstemci Kitaplığı

    Jetonu programatik olarak iptal etmek için GoogleAuth.disconnect() numaralı telefonu arayın:

    GoogleAuth.disconnect();

    OAuth 2.0 Uç Noktalar

    Uygulamanız bir jetonu programatik olarak iptal etmek için https://oauth2.googleapis.com/revoke isteği gönderir ve jetonu bir parametre olarak içerir:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    Jeton bir erişim jetonu veya yenileme jetonu olabilir. Jeton bir erişim jetonuysa ve buna karşılık gelen bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

    İptal işlemi başarılı bir şekilde işlenirse yanıtın HTTP durum kodu 200 olur. Hata koşulları için 400 HTTP durum kodu hata koduyla birlikte döndürülür.

    Aşağıdaki JavaScript snippet'i, JavaScript için Google API'leri İstemci Kitaplığı'nı kullanmadan JavaScript'teki bir jetonun nasıl iptal edileceğini göstermektedir. Google'ın jetonları iptal etmek için kullandığı OAuth 2.0 uç noktası, Merkezler Arası Kaynak Paylaşımı'nı (CORS) desteklemediğinden kod, bir form oluşturur ve isteği yayınlamak için XMLHttpRequest() yöntemini kullanmak yerine formu uç noktaya gönderir.

    function revokeAccess(accessToken) {
      // Google's OAuth 2.0 endpoint for revoking access tokens.
      var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke';
    
      // Create <form> element to use to POST data to the OAuth 2.0 endpoint.
      var form = document.createElement('form');
      form.setAttribute('method', 'post');
      form.setAttribute('action', revokeTokenEndpoint);
    
      // Add access token to the form so it is set as value of 'token' parameter.
      // This corresponds to the sample curl request, where the URL is:
      //      https://oauth2.googleapis.com/revoke?token={token}
      var tokenField = document.createElement('input');
      tokenField.setAttribute('type', 'hidden');
      tokenField.setAttribute('name', 'token');
      tokenField.setAttribute('value', accessToken);
      form.appendChild(tokenField);
    
      // Add form to page and submit it to actually revoke the token.
      document.body.appendChild(form);
      form.submit();
    }