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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

Bu OAuth 2.0 akışına örtülü hibe akışı adı verilir. Yalnızca kullanıcı uygulamada varken API'lere erişen uygulamalar için tasarlanmıştır. Bu uygulamalar gizli bilgi depolayamaz.

Bu akışta uygulamanız, uygulamanızı tanımlamak için sorgu parametrelerini ve uygulamanın gerektirdiği API erişimi türünü kullanan bir Google URL'si 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. Google, daha sonra kullanıcıyı uygulamanıza 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ştirme

Google API'lerini çağıran tüm uygulamaların bu API'leri API Consoleürününde 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 , ürün ailesine ve popülerliğe göre gruplandırılmış tüm kullanılabilir API'leri 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öster'i 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 bilgileri nasıl oluşturacağınız açıklanmaktadır. Ardından 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. Yetkilendirilmiş Google API isteklerinde bulunmak için JavaScript kullanan uygulamalar, yetkili JavaScript kaynaklarını belirtmelidir. Kaynaklar, uygulamanızın OAuth 2.0 sunucusuna istek gönderebileceği alanları belirler. Bu kaynaklar Google'ın doğrulama kurallarına uygun olmalıdır.

Erişim kapsamlarını belirleme

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 etmelerini de sağlar. 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şim izni alması gereken kapsamları belirlemenizi öneririz.

OAuth 2.0 API Kapsamları dokümanı, Google API'lerine erişmek için kullanabileceğiniz kapsamların tam listesini içerir.

OAuth 2.0 erişim jetonları edinme

Aşağıdaki adımlarda, uygulamanızın bir kullanıcı adına API isteği gerçekleştirmek için kullanıcının iznini almak amacıyla uygulamanızın Google'ın OAuth 2.0 sunucusuyla nasıl etkileşime girdiği gösterilmektedir. Uygulamanızın, kullanıcı yetkilendirme 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 üzere 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 elde etmesini ve yetkilendirilmiş 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ı bildirir.

JS İstemci Kitaplığı

JavaScript istemci kitaplığı, yetkilendirme işleminin birçok aşamasını basitleştirir:

  1. Bu işlem, 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 sunucu, söz konusu sunucudan uygulamanıza yeniden yönlendirme yapar.
  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 daha sonra uygulamanız yetkilendirilmiş API çağrıları yaptığında bunu alır.

Aşağıdaki kod snippet'i, bu dokümanın ilerleyen bölümlerinde açıklanan 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ında aşağıdaki alanlar belirtiliyor:

  • 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 Consoleiçinde bulunabilir. Uygulamanız yetkilendirilmiş API isteklerinde bulunduğunda clientId öğesinin gerekli olduğunu unutmayın. Yalnızca yetkisiz isteklerde bulunan uygulamalar yalnızca 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 sınırlandırılmış bir listesini belirtir. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını bildirir.

    Mümkün olduğunda uygulamanızın, yetkilendirme kapsamları için erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme yoluyla kullanıcı verilerine bağlam içinde erişim isteyerek, kullanıcıların uygulamanızın neden istenen erişime 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ı, kaynak şemaları da dahil olmak üzere API yüzeyini tanımlar ve JavaScript istemci kitaplığı, uygulamaların kullanabileceği yöntemler oluşturmak için bu bilgileri kullanır. Bu örnekte kod, Google Drive API'sinin 3. sürümüyle ilgili 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ımlanmamıştır.)

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ı

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

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

Bir kullanıcının verilerine erişme 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();

Pratikte uygulamanız, API çağrısı yapmadan önce signIn() yöntemini çağırıp çağırmayacağınızı belirlemek için bir Boole değeri belirleyebilir.

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ımda kod snippet'inde tanımlanan global değişkenle aynı.

  • 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ımlanmıştır:
    GoogleAuth.isSignedIn.listen(updateSigninStatus);
  • Snippet, iki ek global değişken tanımlar:

    • isAuthorized, kullanıcının zaten oturum açmış olup olmadığını belirten bir Boole değişkenidir. Bu değer, kullanıcı uygulama oturum açtığında veya oturumu kapattığında uygulama yüklendiğinde ayarlanabilir ve güncellenebilir.

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

    • currentApiRequest, kullanıcının denemeye çalıştığı 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 yürütü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 aynı isteği iletmek için 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 https://accounts.google.com/o/oauth2/v2/auth adresindeki OAuth 2.0 uç noktasından erişim isteğinde bulunmak için 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. Değer, istemcinizin API ConsoleCredentials pagebölümünde yapılandırdığınız OAuth 2.0 istemcisinin yetkili yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. Bu değer, sağlanan client_id için yetkili bir 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ının, parametrenin değerini token olarak ayarlaması gerekir. Bu değer, Google Yetkilendirme Sunucusuna, erişim jetonunu, kullanıcıyı yetkilendirme işlemini tamamladıktan sonra yönlendirildiği URI'nın (#) parça tanımlayıcısında bir name=value çifti olarak döndürmesi yönünde uyarır.

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 sadece ihtiyaç duyduğu kaynaklara erişim istemesine olanak tanırken kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol etmelerini de sağlar. Bu nedenle, istenen kapsam sayısı ile kullanıcı izninin alınması olasılığı arasında ters bir ilişki vardır.

Mümkün olduğunda uygulamanızın, yetkilendirme kapsamları için erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme yoluyla kullanıcı verilerine bağlam içinde erişim isteyerek, kullanıcıların uygulamanızın isteme erişimi neden gerekli olduğunu daha kolay anlamalarına yardımcı olursunuz.

state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ve yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerini belirtir. Kullanıcı uygulamanızın erişim isteğine izin verdikten veya reddettikten sonra sunucu, redirect_uri parçasının URL parçası 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ızdaki doğru kaynağa yönlendirmek, nonce'lar göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlarla kullanabilirsiniz. redirect_uri tahmininiz olabileceği için state değeri kullanmak, gelen 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 veya istemcinin durumunu yakalayan başka bir değerin karmasını kodlarsanız isteğin ve yanıtın aynı tarayıcıdan kaynaklandığından emin olmak için yanıtı doğrulayabilirsiniz. Böylece, siteler arası istek sahtekarlığı gibi saldırılara karşı koruma sağlarsınız. state jetonunun nasıl oluşturulup onaylanacağına dair bir örnek için OpenID Connect dokümanlarına bakın.

include_granted_scopes İsteğe bağlı

Uygulamaların, bağlam içinde ek kapsamlara erişim istemek için artımlı yetkilendirmeyi kullanmasına olanak tanır. Bu parametrenin değerini true olarak ayarlarsanız ve yetkilendirme isteği verilirse yeni erişim jetonu, kullanıcının daha önce uygulamaya erişim izni 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 kimliğini doğrulamaya çalıştığını biliyorsa Google Kimlik Doğrulama Sunucusu'na bir ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formunda 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ğiyle eşdeğer olan bir e-posta adresi veya sub tanımlayıcı 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 projeniz ilk kez erişim istediğinde istenir. Daha fazla bilgi için Yeniden izin isteme bölümünü inceleyin.

Olası değerler:

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

Google yetkilendirme sunucusuna yönlendirme yönlendirme örneği

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

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'inde, JavaScript için Google API'leri İstemci Kitaplığı kullanılmadan JavaScript'te yetkilendirme akışının nasıl başlatılacağı gösterilmiştir. Bu OAuth 2.0 uç noktası, merkezler arası kaynak paylaşımını (CORS) desteklemediğinden snippet, söz konusu uç noktaya isteği 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 veremeyeceğine karar verir. Bu aşamada Google, uygulamanızın adını ve kullanıcının yetkilendirme kimlik bilgileriyle erişim izni istediği Google API hizmetlerinin gösterildiği ve erişim kapsamlarının özetini gösteren bir izin penceresi gösterir. Daha sonra kullanıcı, uygulamanız tarafından talep edilen bir veya daha fazla kapsam için erişim izni verebilir ya da isteği reddedebilir.

Google'ın OAuth 2.0 sunucusundan herhangi bir erişim verilip verilmediğini gösteren yanıtı 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. Yaygın 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ı yetkilendiremedi. Bir yöneticinin, OAuth istemci kimliğinize açıkça erişim izni 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 edinmek için Google Workspace Yöneticisi yardım makalesini inceleyin. Google Workspace verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme başlıklı makaleye göz atın.

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çılırken bu hata mesajıyla karşılaşabilir. Geliştiriciler bunun yerine Android için Google ile Oturum Açma veya OpenID Foundation'ın 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ını açıp 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, hem Android App Links işleyicilerini hem de varsayılan tarayıcı uygulamasını içeren varsayılan bağlantı işleyicide genel bağlantıların açılmasına izin vermelidir. Android Özel Sekmeleri kitaplığı da desteklenir.

iOS

iOS ve macOS geliştiricileri, WKWebView'te yetkilendirme istekleri açarken bu hatayla karşılaşabilir. Geliştiriciler bunun yerine iOS için Google ile Oturum Açma veya OpenID Foundation'ın 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ını açıp kullanıcı, sitenizden Google'ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde web geliştiricileri bu hatayla karşılaşabilir. Geliştiriciler, genel bağlantıların işletim sisteminin varsayılan bağlantı işleyicisinde 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 kısıtlayan bir projenin parçasıdır. Bu yapılandırma seçeneği hakkında daha fazla bilgi edinmek için OAuth kullanıcı rızası ekranını ayarlama yardım makalesindeki Kullanıcı türü bölümüne bakın.

origin_mismatch

Yetkilendirme isteğinin kaynağı olan JavaScript'teki şema, alan ve/veya bağlantı noktası, OAuth istemci kimliği için kayıtlı yetkili bir JavaScript kaynak URI'si ile eşleşmeyebilir. Google API Console Credentials page konumunda yetkili JavaScript kaynaklarını inceleyin.

redirect_uri_mismatch

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

Yetkilendirme isteğinin kaynağı olan JavaScript'teki şema, alan ve/veya bağlantı noktası, OAuth istemci kimliği için kayıtlı yetkili bir JavaScript kaynak URI'si ile eşleşmeyebilir. Google API Console Credentials pageadresindeki yetkili JavaScript kaynaklarını inceleyin.

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 kullanıcı, uygulamaya istenen erişim iznini verdiğinde bu işlev çağrılır.

OAuth 2.0 Uç Noktaları

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

Kullanıcı isteği onaylarsa yanıtta bir erişim jetonu bulunur. Kullanıcı isteği onaylamazsa yanıtta bir hata mesajı gösterilir. Erişim jetonu veya hata mesajı, aşağıda gösterildiği gibi yönlendirme URI'sının 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, access_token parametresine ek olarak her zaman Bearer olarak ayarlanan token_type parametresini ve jetonun kullanım süresini saniyeler içinde belirten expires_in parametresini de içerir. Erişim jetonu isteğinde state parametresi belirtilmişse değeri yanıta da eklenir.

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

Örnek OAuth 2.0 sunucu yanıtı

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önlendirileceksiniz. Yerel makineniz bu adreste dosya sunmadığı sürece söz konusu URL, 404 NOT FOUND hatası verir. Bir sonraki adım, kullanıcı uygulamanıza tekrar yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha fazla ayrıntı sağlar.

Google API'lerini Çağırma

JS İstemci Kitaplığı

Uygulamanız bir erişim jetonu aldıktan sonra, kullanıcı adına API isteklerinde bulunmak için JavaScript istemci kitaplığını kullanabilirsiniz. Erişim jetonu sizin için istemci kitaplığından yönetilir. Jetonu istekte göndermek için özel bir işlem yapmanız gerekmez.

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

// 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 alanlarının sağlanması durumunda, belirli bir kullanıcı hesabı adına Google API'ye çağrı yapmak için bu jetonu kullanabilirsiniz. Bunu yapmak için access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API'ye yapılan isteğe erişim jetonunu ekleyin. Sorgu dizeleri sunucu günlüklerinde görünür hale geldiği 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 bilgisi kullanılarak drive.files uç noktasına (Drive Files API) yapılan bir ç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

Aşağıda, kimliği doğrulanmış kullanıcı için access_token sorgu dizesi parametresini kullanarak aynı API'ye yönelik bir çağrı verilmiştir:

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 örneği burada bulabilirsiniz (tercih edilen):

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

Alternatif olarak, sorgu dizesi parametresi seçeneği şu şekilde olabilir:

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

JavaScript örnek kodu

Aşağıdaki kod snippet'i, bir Google API'ye istek göndermek için CORS'yi (kaynaklar arası kaynak paylaşımı) nasıl kullanacağınızı gösterir. Bu örnekte JavaScript için Google API'leri İstemci Kitaplığı kullanılmamaktadır. Bununla birlikte, istemci kitaplığını kullanmıyor olsanız bile, kitaplık kitaplığı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 isteklerinde 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 API isteği gönderirken bunu nasıl alacağı 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 kod örneğinin çalışan bir demosu bulunmaktadı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 eder ve bu sayfayı yenilerseniz söz konusu 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 bir JavaScript uygulamasında OAuth 2.0 akışının nasıl başlatılacağını göstermek için istendi. Bu uygulama API isteğinde bulunmuyor.

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 şu seçeneklerden biri görüntülenir:

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

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ın nasıl tamamlanacağını göstermektedir. Kod, API isteği denemek için bir düğme gösteren bir HTML sayfasına yöneliktir. Düğmeyi tıklarsanız kod, sayfanın tarayıcınızın yerel depolama alanında bir API erişim jetonu saklayıp saklamadığını kontrol eder. Öyleyse API isteğini yürütür. Aksi takdirde OAuth 2.0 akışını başlatır.

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

  1. Kullanıcıyı, https://www.googleapis.com/auth/drive.metadata.readonly kapsamına erişim isteyen Google OAuth 2.0 sunucusuna yönlendirir.
  2. İstenen kapsamlardan birine veya daha fazlasına erişim izni verdikten (veya reddettikten) sonra, kullanıcı orijinal sayfaya yönlendirilir ve erişim jetonu, parça tanımlayıcısı dizesinden ayrıştırılır.
  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ılı bir şekilde 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 yayınlandığı URL olarak ayarlanmalıdır. Değer, API Console Credentials pageürününde 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. Projeniz de bu istek için uygun API'yi etkinleştirmiş olmalıdır.

<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 uymalıdır. Alan, ana makine ve şema tanımı için aşağıda belirtilen RFC 3986 bölüm 3'e bakın.

Doğrulama kuralları
Şema

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

Düzenleyen

Ana makineler ham IP adresi 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.
  • Uygulamanın sahibi alan adı değilse JavaScript kaynakları 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 dahil olmak üzere belirli karakterler içeremez:
    • Joker karakter ('*')
    • Yazdırılamayan ASCII karakterler
    • Geçersiz yüzde kodlamaları (yüzde işaretinden sonraki URL kodlama biçimine uymayan yüzde kodlaması, ardından iki on altılık basamak)
    • 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şim için yetkilendirme ister. İhtiyaç duyduğunuzda kaynaklar için yetkilendirme istemek en iyi kullanıcı deneyimi uygulaması olarak kabul edilir. Google'ın yetkilendirme sunucusu, bu uygulamayı etkinleştirmek için 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 projeye verdiği tüm kapsamları içeren bir jeton karşılığında gönderilebilen bir yetkilendirme kodu döndürür.

    Örneğin, kullanıcıların müzik parçalarını denemelerine ve mix oluşturmalarına olanak tanıyan bir uygulama, oturum açma sırasında çok az sayıda kaynağa ihtiyaç duyabilir. Bu durum oturum açan kişinin adından farklı olabilir. Bununla birlikte, tamamlanmış bir karışımı kaydetmek için Google Drive'ına erişmeleri gerekir. Çoğu kişi, uygulamanın gerçekten ihtiyaç duyduğu anda yalnızca Google Drive'ına erişmeleri isteniyorsa bunu doğal bulur.

    Bu durumda oturum açma sırasında uygulama, temel oturum açma işlemini gerçekleştirmek için openid ve profile kapsamlarını talep edebilir, ardından ilk isteğin karıştığı durumlarda https://www.googleapis.com/auth/drive.file kapsamını kaydedebilir.

    Aşağıdaki kurallar, ek yetkilendirmeden alınan bir erişim jetonu için geçerlidir:

    • Jeton, yeni ve birleştirilmiş yetkilendirmeye dahil edilen kapsamların 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ıta dahil edilen scope değerlerinden herhangi biri için kullanılabilir.
    • Birleştirilmiş yetkilendirme, bağışların farklı istemcilerden istenmiş olsa bile kullanıcının API projesine verdiği tüm kapsamları içerir. Örneğin, kullanıcı bir uygulamanın masaüstü istemcisini kullanarak bir kapsama erişim izni verip ardından mobil istemci üzerinden aynı uygulamaya başka bir erişim verdiyse 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östermektedir. Bu yaklaşım, uygulamanızın birden fazla erişim jetonu 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 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 include_granted_scopes parametresini Google'ın OAuth 2.0 sunucusuna gönderdiğiniz isteğe 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ındaki oauth2-test-params.scope özelliğini ayarlayarak erişim jetonunun geçerli olduğu kapsamların listesini depolar.)

    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) ile 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 etme

    Bazı durumlarda, kullanıcı bir uygulamaya verilen erişimi iptal etmek isteyebilir. Kullanıcı, Hesap Ayarları'na giderek erişimi iptal edebilir. Daha fazla bilgi için Hesabınıza erişimi olan Üçüncü taraf sitelerin ve uygulamaların site veya uygulama erişimini kaldırma destek dokümanına bakın.

    Bir uygulamanın kendisine verilen erişimi programatik olarak iptal etmesi de mümkündür. Programatik iptal, kullanıcının abonelikten çıktığı, bir uygulamayı kaldırdığı veya uygulama için gereken API kaynaklarının önemli ölçüde değiştiği durumlarda önemlidir. Diğer bir deyişle kaldırma işleminin bir parçası, daha önce uygulamaya verilen izinlerin kaldırıldığından emin olmak için bir API isteği içerebilir.

    JS İstemci Kitaplığı

    Jetonu programatik olarak iptal etmek için GoogleAuth.disconnect() yöntemini çağırın:

    GoogleAuth.disconnect();

    OAuth 2.0 Uç Noktaları

    Uygulamanız bir jetonu programlı bir şekilde iptal etmek için https://oauth2.googleapis.com/revoke öğesine bir istekte bulunur ve jetonu parametre olarak ekler:

    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ıyla gerçekleştirildiğinde 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'inde, JavaScript için Google API'leri İstemci Kitaplığı kullanılmadan JavaScript'teki bir jetonun nasıl iptal edileceği gösterilmektedir. Google'ın jetonları iptal etme için OAuth 2.0 uç noktası, merkezler arası kaynak paylaşımını (CORS) desteklemediğinden kod bir istek 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();
    }