Web Sunucusu Uygulamaları için OAuth 2.0'ı Kullanma

Bu dokümanda, web sunucusu uygulamalarının Google API'lerine erişmek için OAuth 2.0 yetkilendirmesini uygulamak üzere Google API İstemci Kitaplıklarını veya Google OAuth 2.0 uç noktalarını nasıl kullandığı 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şmalarına olanak tanır. Örneğin, bir uygulama, kullanıcılardan kendi Google Drive'larında dosya depolama izni almak için OAuth 2.0'ı kullanabilir.

Bu OAuth 2.0 akışı özellikle kullanıcı yetkilendirmeye yöneliktir. Gizli bilgileri depolayabilen ve durumu koruyabilen uygulamalar için tasarlanmıştır. Düzgün yetkilendirilmiş bir web sunucusu uygulaması, kullanıcı uygulamayla etkileşimde bulunurken veya kullanıcı uygulamadan ayrıldıktan sonra API'ye erişebilir.

Web sunucusu uygulamaları, özellikle de kullanıcıya özel veriler yerine proje tabanlı verilere erişmek için Cloud API'lerini çağırırken API isteklerini yetkilendirmek amacıyla sıklıkla hizmet hesapları kullanır. Web sunucusu uygulamaları, hizmet hesaplarını kullanıcı yetkilendirmesiyle birlikte kullanabilir.

İstemci kitaplıkları

Bu sayfadaki dile özgü örneklerde, OAuth 2.0 yetkilendirmesini uygulamak için Google API İstemci Kitaplıkları kullanılmaktadır. Kod örneklerini çalıştırmak için önce dilinize ait istemci kitaplığını yüklemeniz gerekir.

Uygulamanızın OAuth 2.0 akışını işlemek için Google API İstemci Kitaplığı kullandığınızda istemci kitaplığı, uygulamanın normalde kendi başına yapması gereken birçok işlemi gerçekleştirir. Örneğin, uygulamanın ne zaman depolanan erişim jetonlarını kullanabileceğini veya yenileyebildiğini ve uygulamanın ne zaman yeniden izin alması gerektiğini belirler. Ayrıca istemci kitaplığı, doğru yönlendirme URL'lerini oluşturur ve yetkilendirme kodlarını erişim jetonları ile değiştiren yönlendirme işleyicilerin uygulanmasına yardımcı olur.

Sunucu tarafı uygulamalar için Google API İstemci Kitaplıkları aşağıdaki dillerde kullanılabilir:

Ön koşullar

Projeniz için API'leri etkinleştirin

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

Projeniz için bir API'yi etkinleştirmek üzere:

  1. Google API ConsoleiçindeOpen the API Library .
  2. If prompted, select a project, or create a new one.
  3. API Library sayfasında, ürün ailesine ve popülerliğe göre gruplandırılmış tüm API'ler listelenir. Etkinleştirmek istediğiniz API listede görünmüyorsa bulmak için arama özelliğini 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çin, ardından 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, uygulamayı Google'ın OAuth 2.0 sunucusuna tanımlayan yetkilendirme kimlik bilgilerine sahip olmalıdır. Aşağıdaki adımlarda projeniz için nasıl kimlik bilgisi oluşturacağınız açıklanmaktadır. Daha sonra uygulamalarınız bu proje için etkinleştirdiğiniz API'lere erişmek için 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 ve Oluştur'u tıklayın. PHP, Java, Python, Ruby ve .NET gibi diller ve çerçeveler kullanan uygulamalar, yetkili yönlendirme URI'leri belirtmelidir. Yönlendirme URI'leri, OAuth 2.0 sunucusunun yanıt gönderebileceği uç noktalardır. Bu uç noktalar Google'ın doğrulama kurallarına uygun olmalıdır.

    Test için http://localhost:8080 gibi yerel makineyi belirten URI'lar belirtebilirsiniz. Bunu aklınızda bulundurarak lütfen bu belgedeki tüm örneklerin yönlendirme URI'si olarak http://localhost:8080 kullandığını unutmayın.

    Uygulamanızın kimlik doğrulama uç noktalarını tasarlamanızı öneririz. Böylece uygulamanız yetkilendirme kodlarını sayfadaki diğer kaynaklara maruz bırakmaz.

Kimlik bilgilerinizi oluşturduktan sonra API Consoleüzerinden client_secret.json dosyasını indirin. Dosyayı yalnızca uygulamanızın erişebileceği bir konumda güvenli bir şekilde saklayın.

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 da verdikleri erişim miktarını kontrol etmesini sağlar. Bu nedenle, istenen kapsam sayısı ile kullanıcıdan izin 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.

Ayrıca uygulamanızın, bağlam içinde kullanıcı verilerine erişim istediği artımlı yetkilendirme süreci üzerinden yetkilendirme kapsamlarına erişim istemesini öneririz. Bu en iyi uygulama, kullanıcıların uygulamanızın neden erişim istediğini daha kolay anlamasına yardımcı olur.

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

Dile özgü gereksinimler

Bu dokümandaki kod örneklerinden herhangi birini çalıştırmak için Google Hesabınızın, internet erişiminizin ve web tarayıcınızın olması gerekir. API istemci kitaplıklarından birini kullanıyorsanız aşağıdaki dile özgü gereksinimlere de bakın.

PHP

Bu belgede PHP kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız olacaktır:

  • Komut satırı arayüzü (CLI) ve JSON uzantısı yüklü PHP 5.6 veya sonraki sürümler.
  • Composer bağımlılık yönetimi aracı.
  • PHP için Google API'leri İstemci Kitaplığı:

    composer require google/apiclient:^2.10

Python

Bu belgede Python kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız olacaktır:

  • Python 2.6 veya sonraki sürümler
  • pip paket yönetim aracı.
  • Python için Google API'leri İstemci Kitaplığı:
    pip install --upgrade google-api-python-client
  • Kullanıcı yetkilendirmesi için google-auth, google-auth-oauthlib ve google-auth-httplib2.
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • Flask Python web uygulaması çerçevesi.
    pip install --upgrade flask
  • requests HTTP kitaplığı.
    pip install --upgrade requests

Ruby

Bu belgede Ruby kod örneklerini çalıştırmak için şunlar gerekir:

  • Ruby 2.6 veya sonraki sürümler
  • Ruby için Google Yetkilendirme Kitaplığı:

    gem install googleauth
  • Sinatra Ruby web uygulaması çerçevesidir.

    gem install sinatra

Node.js

Bu belgede Node.js kod örneklerini çalıştırmak için gerekenler:

  • Bakım LTS, etkin LTS veya Node.js'nin mevcut sürümü.
  • Google API'leri Node.js İstemcisi:

    npm install googleapis

HTTP/REST

OAuth 2.0 uç noktalarını doğrudan çağırabilmek için herhangi bir kitaplık yüklemeniz gerekmez.

OAuth 2.0 erişim jetonları edinme

Aşağıdaki adımlarda, uygulamanızın kullanıcı adına API isteği gerçekleştirmek için kullanıcıdan izin almak üzere Google'ın OAuth 2.0 sunucusuyla nasıl etkileşimde bulunduğu gösterilmektedir. Uygulamanızın, kullanıcı yetkilendirmesi gerektiren bir Google API isteğini yürütebilmesi için önce bu izni alması gerekir.

Aşağıdaki listede, bu adımlar hızlı bir şekilde özetlenmektedir:

  1. Uygulamanız ihtiyaç duyduğu izinleri tanımlar.
  2. Uygulamanız, kullanıcıyı istenen izinlerin listesiyle birlikte Google'a yönlendirir.
  3. Uygulamanıza izin verilip verilmeyeceğine kullanıcı karar verir.
  4. Uygulamanız kullanıcının neye karar verdiğini öğrenir.
  5. Kullanıcı istenen izinleri verdiyse uygulamanız kullanıcı adına API istekleri yapmak için gereken jetonları alır.

1. Adım: Yetkilendirme parametrelerini ayarlayın

İlk adım yetkilendirme isteğini oluşturmaktır. Bu istek, uygulamanızı tanımlayan ve kullanıcıdan uygulamanıza vermesi istenen izinleri tanımlayan parametreleri ayarlar.

  • OAuth 2.0 kimlik doğrulaması ve yetkilendirmesi için Google istemci kitaplığı kullanıyorsanız bu parametreleri tanımlayan bir nesne oluşturup yapılandırırsınız.
  • Google OAuth 2.0 uç noktasını doğrudan çağırırsanız bir URL oluşturur ve bu URL'de parametreleri ayarlarsınız.

Aşağıdaki sekmeler, web sunucusu uygulamaları için desteklenen yetkilendirme parametrelerini tanımlar. Dile özgü örnekler, bu parametreleri ayarlayan bir nesneyi yapılandırmak için istemci kitaplığının veya yetkilendirme kitaplığının nasıl kullanılacağını da gösterir.

PHP

Aşağıdaki kod snippet'i, yetkilendirme isteğindeki parametreleri tanımlayan bir Google\Client() nesnesi oluşturur.

Bu nesne, uygulamanızı tanımlamak için client_secret.json dosyanızdaki bilgileri kullanır. (Bu dosya hakkında daha fazla bilgi edinmek için yetkilendirme kimlik bilgileri oluşturma bölümüne bakın.) Nesne ayrıca uygulamanızın erişim izni istediği kapsamları ve uygulamanızın Google OAuth 2.0 sunucusundan gelen yanıtı işleyecek kimlik doğrulama uç noktasının URL'sini de tanımlar. Son olarak, kod isteğe bağlı access_type ve include_granted_scopes parametrelerini ayarlar.

Örneğin, bu kod kullanıcının Google Drive'ına salt okunur, çevrimdışı erişim ister:

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" will prompt the user for consent
$client->setPrompt('consent');
$client->setIncludeGrantedScopes(true);   // incremental auth

İstek aşağıdaki bilgileri belirtir:

Parametreler
client_id Zorunlu

Uygulamanızın istemci kimliği. Bu değeri API Console Credentials pageiçinde bulabilirsiniz.

PHP'de, bir client_secret.json dosyasından yetkilendirme kimlik bilgilerini yüklemek için setAuthConfig işlevini çağırın.

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
redirect_uri Zorunlu

Kullanıcı, yetkilendirme akışını tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendirdiğini belirler. Değer, istemcinizin API Console Credentials pageiçinde yapılandırdığınız OAuth 2.0 istemcisi için yetkilendirilmiş yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. 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 kullanımı ve sondaki eğik çizginin ("/") eşleşmesi gerektiğini unutmayın.

Bu değeri PHP'de ayarlamak için setRedirectUri işlevini çağırın. Sağlanan client_id için geçerli bir yönlendirme URI'si belirtmeniz gerektiğini unutmayın.

$client->setRedirectUri('https://oauth2.example.com/code');
scope Zorunlu

Uygulamanızın kullanıcı adına erişebileceği kaynakları tanımlayan alanla sınırlı bir kapsam listesidir. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını bilgilendirir.

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

Bu değeri PHP'de ayarlamak için addScope işlevini çağırın:

$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

Uygulamanızın, mümkün olduğunda bağlam içinde yetkilendirme kapsamlarına erişim istemesini öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine bağlam içinde erişim isteğinde bulunarak kullanıcıların, uygulamanızın istediği erişime neden ihtiyaç duyduğunu daha kolay anlamalarına yardımcı olursunuz.

access_type Önerilen

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri, varsayılan değer olan online ve offline şeklindedir.

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız jetonlar için bir yetkilendirme kodunu ilk kez değiştirdiğinde Google yetkilendirme sunucusuna yenileme jetonu ve bir erişim jetonu döndürmesini bildirir.

Bu değeri PHP'de ayarlamak için setAccessType işlevini çağırın:

$client->setAccessType('offline');
state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir. Kullanıcı, uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra sunucu, redirect_uri öğesinin URL sorgu bileşeninde (?) 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, tek seferlik rastgele sayılar göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. redirect_uri tahmin edilebileceğinden, state değeri kullanmak, gelen bağlantının 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 ve yanıtın aynı tarayıcıdan kaynaklandığından emin olmak için yanıtı doğrulayabilirsiniz. Bu sayede, siteler arası istek sahtekarlığı gibi saldırılara karşı koruma sağlar. state jetonunun nasıl oluşturulacağı ve onaylanacağı ile ilgili bir örnek için OpenID Connect dokümanlarını inceleyin.

Bu değeri PHP'de ayarlamak için setState işlevini çağırın:

$client->setState($sample_passthrough_value);
include_granted_scopes İsteğe bağlı

Uygulamaların, bağlam içinde ek kapsamlara erişim istemek için artımlı yetkilendirme 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 artımlı yetkilendirme bölümüne bakın.

Bu değeri PHP'de ayarlamak için setIncludeGrantedScopes işlevini çağırın:

$client->setIncludeGrantedScopes(true);
login_hint İsteğe bağlı

Uygulamanız hangi kullanıcının kimliğini doğrulamaya çalıştığını bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için 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ğiyle eşdeğer olan bir e-posta adresi veya sub tanımlayıcısı olarak ayarlayın.

Bu değeri PHP'de ayarlamak için setLoginHint işlevini çağırın:

$client->setLoginHint('None');
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 yalnızca projeniz ilk kez erişim istediğinde kullanıcıya istem gösterilir. Daha fazla bilgi için Yeniden izin isteme bölümüne bakın.

Bu değeri PHP'de ayarlamak için setPrompt işlevini çağırın:

$client->setPrompt('consent');

Olası değerler:

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

Python

Aşağıdaki kod snippet'i, yetkilendirme isteğini oluşturmak için google-auth-oauthlib.flow modülünü kullanır.

Bu kod bir Flow nesnesi oluşturur. Bu nesne, yetkilendirme kimlik bilgilerini oluşturduktan sonra indirdiğiniz client_secret.json dosyasındaki bilgileri kullanarak uygulamanızı tanımlar. Bu nesne ayrıca uygulamanızın erişim izni istediği kapsamları ve uygulamanızın Google OAuth 2.0 sunucusundan gelen yanıtı işleyecek kimlik doğrulama uç noktasının URL'sini de tanımlar. Son olarak kod, isteğe bağlı access_type ve include_granted_scopes parametrelerini ayarlar.

Örneğin, bu kod kullanıcının Google Drive'ına salt okunur, çevrimdışı erişim ister:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

# Indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
flow.redirect_uri = 'https://www.example.com/oauth2callback'

# Generate URL for request to Google's OAuth 2.0 server.
# Use kwargs to set optional request parameters.
authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')

İstek aşağıdaki bilgileri belirtir:

Parametreler
client_id Zorunlu

Uygulamanızın istemci kimliği. Bu değeri API Console Credentials pageiçinde bulabilirsiniz.

Python'da, bir client_secret.json dosyasından istemci kimliğini almak için from_client_secrets_file yöntemini çağırın. (İstemci yapılandırmasını başlangıçta bir istemci gizli anahtarı dosyasında göründüğü hâlde aktaran ancak dosyanın kendisine erişmeyen from_client_config yöntemini de kullanabilirsiniz.)

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])
redirect_uri Zorunlu

Kullanıcı, yetkilendirme akışını tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendirdiğini belirler. Değer, istemcinizin API Console Credentials pageiçinde yapılandırdığınız OAuth 2.0 istemcisi için yetkilendirilmiş yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. 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 kullanımı ve sondaki eğik çizginin ("/") eşleşmesi gerektiğini unutmayın.

Bu değeri Python'da ayarlamak için flow nesnesinin redirect_uri özelliğini ayarlayın:

flow.redirect_uri = 'https://oauth2.example.com/code'
scope Zorunlu

Uygulamanızın kullanıcı adına erişebileceği kaynakları tanımlayan kapsamların listesidir. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını bilgilendirir.

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

Python'da, kapsam listesini belirtmek üzere client_id öğesini ayarlamak için kullandığınız yöntemi kullanın.

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

Uygulamanızın, mümkün olduğunda bağlam içinde yetkilendirme kapsamlarına erişim istemesini öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine bağlam içinde erişim isteğinde bulunarak kullanıcıların, uygulamanızın istediği erişime neden ihtiyaç duyduğunu daha kolay anlamalarına yardımcı olursunuz.

access_type Önerilen

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri, varsayılan değer olan online ve offline şeklindedir.

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız jetonlar için bir yetkilendirme kodunu ilk kez değiştirdiğinde Google yetkilendirme sunucusuna yenileme jetonu ve bir erişim jetonu döndürmesini bildirir.

Python'da flow.authorization_url yöntemini çağırırken access_type parametresini anahtar kelime bağımsız değişkeni olarak belirterek access_type parametresini ayarlayın:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir. Kullanıcı, uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra sunucu, redirect_uri öğesinin URL sorgu bileşeninde (?) 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, tek seferlik rastgele sayılar göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. redirect_uri tahmin edilebileceğinden, state değeri kullanmak, gelen bağlantının 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 ve yanıtın aynı tarayıcıdan kaynaklandığından emin olmak için yanıtı doğrulayabilirsiniz. Bu sayede, siteler arası istek sahtekarlığı gibi saldırılara karşı koruma sağlar. state jetonunun nasıl oluşturulacağı ve onaylanacağı ile ilgili bir örnek için OpenID Connect dokümanlarını inceleyin.

Python'da, flow.authorization_url yöntemini çağırırken state parametresini anahtar kelime bağımsız değişkeni olarak belirterek state parametresini ayarlayın:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    state=sample_passthrough_value,
    include_granted_scopes='true')
include_granted_scopes İsteğe bağlı

Uygulamaların, bağlam içinde ek kapsamlara erişim istemek için artımlı yetkilendirme 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 artımlı yetkilendirme bölümüne bakın.

Python'da flow.authorization_url yöntemini çağırırken include_granted_scopes parametresini anahtar kelime bağımsız değişkeni olarak belirterek include_granted_scopes parametresini ayarlayın:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
login_hint İsteğe bağlı

Uygulamanız hangi kullanıcının kimliğini doğrulamaya çalıştığını bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için 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ğiyle eşdeğer olan bir e-posta adresi veya sub tanımlayıcısı olarak ayarlayın.

Python'da flow.authorization_url yöntemini çağırırken login_hint parametresini anahtar kelime bağımsız değişkeni olarak belirterek login_hint parametresini ayarlayın:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    login_hint='None',
    include_granted_scopes='true')
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 yalnızca projeniz ilk kez erişim istediğinde kullanıcıya istem gösterilir. Daha fazla bilgi için Yeniden izin isteme bölümüne bakın.

Python'da, flow.authorization_url yöntemini çağırırken prompt parametresini anahtar kelime bağımsız değişkeni olarak belirterek prompt parametresini ayarlayın:

authorization_url, state = flow.authorization_url(
      access_type='offline',
      prompt='consent',
      include_granted_scopes='true')

Olası değerler:

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

Ruby

Uygulamanızda istemci nesnesini yapılandırmak için oluşturduğunuz client_secrets.json dosyasını kullanın. Bir istemci nesnesini yapılandırırken uygulamanızın erişmesi gereken kapsamları ve uygulamanızın kimlik doğrulama uç noktasının URL'sini belirtirsiniz. Bu kapsam, yanıtı OAuth 2.0 sunucusundan işler.

Örneğin, bu kod kullanıcının Google Drive'ına salt okunur, çevrimdışı erişim ister:

require 'google/apis/drive_v3'
require "googleauth"
require 'googleauth/stores/redis_token_store'

client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json')
scope = 'https://www.googleapis.com/auth/drive.metadata.readonly'
token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, '/oauth2callback')

Your application uses the client object to perform OAuth 2.0 operations, such as generating authorization request URLs and applying access tokens to HTTP requests.

Node.js

The code snippet below creates a google.auth.OAuth2 object, which defines the parameters in the authorization request.

That object uses information from your client_secret.json file to identify your application. To ask for permissions from a user to retrieve an access token, you redirect them to a consent page. To create a consent page URL:

const {google} = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
 * from the client_secret.json file. To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

Önemli Not - refresh_token yalnızca ilk yetkilendirmede iade edilir. Daha fazla bilgiyi burada bulabilirsiniz.

HTTP/REST

Google'ın OAuth 2.0 uç noktası https://accounts.google.com/o/oauth2/v2/auth adresinde. Bu uç noktaya yalnızca 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 pageiçinde bulabilirsiniz.

redirect_uri Zorunlu

Kullanıcı, yetkilendirme akışını tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendirdiğini belirler. Değer, istemcinizin API Console Credentials pageiçinde yapılandırdığınız OAuth 2.0 istemcisi için yetkilendirilmiş yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. 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 kullanımı ve sondaki eğik çizginin ("/") eşleşmesi gerektiğini unutmayın.

response_type Zorunlu

Google OAuth 2.0 uç noktasının yetkilendirme kodu döndürüp döndürmeyeceğini belirler.

Web sunucusu uygulamaları için parametre değerini code olarak ayarlayın.

scope Zorunlu

Uygulamanızın kullanıcı adına erişebileceği kaynakları tanımlayan alanla sınırlı bir kapsam listesidir. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını bilgilendirir.

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

Uygulamanızın, mümkün olduğunda bağlam içinde yetkilendirme kapsamlarına erişim istemesini öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine bağlam içinde erişim isteğinde bulunarak kullanıcıların, uygulamanızın istediği erişime neden ihtiyaç duyduğunu daha kolay anlamalarına yardımcı olursunuz.

access_type Önerilen

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri, varsayılan değer olan online ve offline şeklindedir.

Kullanıcı tarayıcıda değilken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız jetonlar için bir yetkilendirme kodunu ilk kez değiştirdiğinde Google yetkilendirme sunucusuna yenileme jetonu ve bir erişim jetonu döndürmesini bildirir.

state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir. Kullanıcı, uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra sunucu, redirect_uri öğesinin URL sorgu bileşeninde (?) 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, tek seferlik rastgele sayılar göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. redirect_uri tahmin edilebileceğinden, state değeri kullanmak, gelen bağlantının 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 ve yanıtın aynı tarayıcıdan kaynaklandığından emin olmak için yanıtı doğrulayabilirsiniz. Bu sayede, siteler arası istek sahtekarlığı gibi saldırılara karşı koruma sağlar. state jetonunun nasıl oluşturulacağı ve onaylanacağı ile ilgili bir örnek için OpenID Connect dokümanlarını inceleyin.

include_granted_scopes İsteğe bağlı

Uygulamaların, bağlam içinde ek kapsamlara erişim istemek için artımlı yetkilendirme 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 artımlı 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ı bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için 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ğiyle eşdeğer olan 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 yalnızca projeniz ilk kez erişim istediğinde kullanıcıya istem gösterilir. Daha fazla bilgi için Yeniden izin isteme bölümüne bakın.

Olası değerler:

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

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

Kimlik doğrulama ve yetkilendirme işlemini başlatmak için kullanıcıyı Google'ın OAuth 2.0 sunucusuna yönlendirin. Genellikle bu durum, uygulamanızın kullanıcı verilerine ilk kez erişmesi gerektiğinde ortaya çıkar. Artımlı yetkilendirme söz konusu olduğunda bu adım, uygulamanızın henüz erişim izni olmayan ek kaynaklara ilk kez erişmesi gerektiğinde de gerçekleşir.

PHP

  1. Google'ın OAuth 2.0 sunucusundan erişim istemek için bir URL oluşturun:
    $auth_url = $client->createAuthUrl();
  2. Kullanıcıyı $auth_url sayfasına yönlendir:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

Bu örnekte, Flask web uygulaması çerçevesi kullanılarak kullanıcının yetkilendirme URL'sine nasıl yönlendirileceği gösterilmektedir:

return flask.redirect(authorization_url)

Ruby

  1. Google'ın OAuth 2.0 sunucusundan erişim istemek için bir URL oluşturun:
    auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
  2. Kullanıcıyı auth_uri sayfasına yönlendirin.

Node.js

  1. Google'ın OAuth 2.0 sunucusundan erişim isteğinde bulunmak için 1. adımda generateAuthUrl yönteminde oluşturulan authorizationUrl URL'sini kullanın.
  2. Kullanıcıyı authorizationUrl sayfasına yönlendirin.
    res.writeHead(301, { "Location": authorizationUrl });

HTTP/REST

Sample redirect to Google's authorization server

An example URL is shown below, with line breaks and spaces for readability.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 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.

Google'ın OAuth 2.0 sunucusu, kullanıcının kimliğini doğrular ve uygulamanızın istenen kapsamlara erişmesi için kullanıcıdan izin alır. Yanıt, belirttiğiniz yönlendirme URL'si kullanılarak uygulamanıza geri gönderilir.

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

Bu adımda kullanıcı, uygulamanıza istenen erişim iznini verip vermeyeceğ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 hizmetlerini ve verilecek erişim kapsamlarının özetini gösteren bir izin penceresi görüntüler. Böylece 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 herhangi bir erişim verilip verilmediğini belirten yanıtı beklediği için uygulamanızın bu aşamada herhangi bir işlem yapmasına gerek yoktur. Bu yanıt, aşağıdaki adımda açıklanmıştır.

Hatalar

Google'ın OAuth 2.0 yetkilendirme uç noktasına gönderilen istekler, beklenen kimlik doğrulama ve yetkilendirme akışları yerine kullanıcılara yönelik hata mesajları gösterebilir. Yaygın hata kodları ve önerilen çözümler aşağıda listelenmiştir.

admin_policy_enforced

Google Hesabı, Google Workspace yöneticisinin politikaları nedeniyle istenen bir veya daha fazla kapsamı yetkilendiremiyor. 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 için Google Workspace verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme başlıklı Google Workspace Yöneticisi yardım makalesine göz atın.

disallowed_useragent

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

Android

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

Bir Android uygulaması, yerleştirilmiş bir 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, genel bağlantıların hem Android Uygulama Bağlantıları işleyicilerini hem de varsayılan tarayıcı uygulamasını içeren işletim sisteminin varsayılan bağlantı işleyicisinde açılmasına izin vermelidir. Android Özel Sekmeler kitaplığı da desteklenen bir seçenektir.

iOS

iOS ve macOS geliştiricileri, WKWebView'te yetkilendirme isteklerini açarken bu hatayla karşılaşabilir. Geliştiriciler bunun yerine iOS için Google ile Oturum Açma veya OpenID Foundation tarafından sunulan 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 bir 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, genel bağlantıların hem Geçiş Bağlantıları işleyicilerini hem de varsayılan tarayıcı uygulamasını içeren işletim sisteminin varsayılan bağlantı işleyicisinde açılmasına izin vermelidir. SFSafariViewController kitaplığı da desteklenen bir seçenektir.

org_internal

İstekteki OAuth istemci kimliği, belirli bir Google Cloud Kuruluşu'ndaki 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 izin ekranınızı ayarlamayla ilgili yardım makalesinin Kullanıcı türü bölümüne göz atın.

invalid_client

OAuth istemci gizli anahtarı yanlış. Bu istek için kullanılan istemci kimliği ve gizli anahtar da dahil olmak üzere OAuth istemci yapılandırmasını inceleyin.

invalid_grant

Bir erişim jetonunu yenilerken veya artımlı yetkilendirme kullanırken jetonun süresi dolmuş veya jetonun geçersiz kılınmış olması mümkündür. Kullanıcının kimliğini tekrar doğrulayın ve yeni jetonlar almak için kullanıcıdan izin isteyin. Bu hatayı görmeye devam ediyorsanız uygulamanızın doğru yapılandırıldığından ve isteğinizde doğru jetonları ve parametreleri kullandığınızdan emin olun. Aksi takdirde, kullanıcı hesabı silinmiş veya devre dışı bırakılmış olabilir.

redirect_uri_mismatch

Yetkilendirme isteğinde iletilen redirect_uri, OAuth istemci kimliğine ait yetkili yönlendirme URI'siyle eşleşmiyor. Google API Console Credentials pageiçindeki yetkili yönlendirme URI'lerini inceleyin.

redirect_uri parametresi, kullanımdan kaldırılan ve artık desteklenmeyen OAuth bant dışı (OOB) akışına işaret ediyor olabilir. Entegrasyonunuzu güncellemek için taşıma kılavuzuna bakın.

invalid_request

Gönderdiğiniz istekle ilgili bir sorun var. Bunun birkaç nedeni olabilir:

  • İstek düzgün şekilde biçimlendirilmemiş
  • İstekte gerekli parametreler eksikti
  • İstek, Google'ın desteklemediği bir yetkilendirme yöntemi kullanıyor. OAuth entegrasyonunuzda önerilen entegrasyon yönteminin kullanıldığını doğrulama

4. Adım: OAuth 2.0 sunucu yanıtını ele alın

OAuth 2.0 sunucusu, istekte belirtilen URL'yi kullanarak uygulamanızın erişim isteğine yanıt verir.

Kullanıcı erişim isteğini onaylarsa yanıt, yetkilendirme kodu içerir. Kullanıcı isteği onaylamazsa yanıt bir hata mesajı içerir. Web sunucusuna döndürülen yetkilendirme kodu veya hata mesajı, sorgu dizesinde aşağıda gösterildiği gibi görünür:

Hata yanıtı:

https://oauth2.example.com/auth?error=access_denied

Yetkilendirme kodu yanıtı:

https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

Ö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&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 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 bir dosya sunmadığı sürece büyük olasılıkla 404 NOT FOUND hatası oluşur. Bir sonraki adım, kullanıcı uygulamanıza geri yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha fazla ayrıntı sağlar.

5. Adım: Yenileme ve erişim jetonları için yetkilendirme kodu değiştirin

Web sunucusu yetkilendirme kodunu aldıktan sonra, yetkilendirme kodunu bir erişim jetonuyla değiştirebilir.

PHP

Yetkilendirme kodunu erişim jetonuyla değiştirmek için authenticate yöntemini kullanın:

$client->authenticate($_GET['code']);

Erişim jetonunu getAccessToken yöntemiyle alabilirsiniz:

$access_token = $client->getAccessToken();

Python

Geri çağırma sayfanızda, yetkilendirme sunucusu yanıtını doğrulamak için google-auth kitaplığını kullanın. Ardından, ilgili yanıttaki yetkilendirme kodunu bir erişim jetonuyla değiştirmek için flow.fetch_token yöntemini kullanın:

state = flask.session['state']
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'],
    state=state)
flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

authorization_response = flask.request.url
flow.fetch_token(authorization_response=authorization_response)

# Store the credentials in the session.
# ACTION ITEM for developers:
#     Store user's access and refresh tokens in your data store if
#     incorporating this code into your real app.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'token_uri': credentials.token_uri,
    'client_id': credentials.client_id,
    'client_secret': credentials.client_secret,
    'scopes': credentials.scopes}

Ruby

Geri çağırma sayfanızda, yetkilendirme sunucusu yanıtını doğrulamak için googleauth kitaplığını kullanın. Yetkilendirme kodunu kaydetmek ve ilk olarak yetkilendirme isteğinde bulunan URL'ye yönlendirme yapmak için authorizer.handle_auth_callback_deferred yöntemini kullanın. Bu işlem, sonuçları kullanıcının oturumunda geçici olarak saklayarak kod değişimini erteler.

  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url

Node.js

Yetkilendirme kodunu erişim jetonuyla değiştirmek için getToken yöntemini kullanın:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
if (req.url.startsWith('/oauth2callback')) {
  // Handle the OAuth 2.0 server response
  let q = url.parse(req.url, true).query;

  // Get access and refresh tokens (if access_type is offline)
  let { tokens } = await oauth2Client.getToken(q.code);
  oauth2Client.setCredentials(tokens);
}

HTTP/REST

Yetkilendirme kodunu erişim jetonuyla değiştirmek için https://oauth2.googleapis.com/token uç noktasını çağırın ve aşağıdaki parametreleri ayarlayın:

Alanlar
client_id Credentials pageöğesinden alınan API Console istemci kimliği.
client_secret Credentials pageöğesinden alınan istemci gizli anahtarı API Console.
code İlk istekte döndürülen yetkilendirme kodu.
grant_type OAuth 2.0 spesifikasyonunda tanımlandığı gibi, bu alanın değeri authorization_code olarak ayarlanmalıdır.
redirect_uri Belirtilen client_id için API Console Credentials page bölümünde projeniz için listelenen yönlendirme URI'lerinden biri.

Aşağıdaki snippet'te örnek bir istek gösterilmektedir:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

Google bu isteğe, kısa ömürlü erişim jetonu ve yenileme jetonu içeren bir JSON nesnesi döndürerek yanıt verir. Yenileme jetonunun yalnızca uygulamanız Google'ın yetkilendirme sunucusuna gönderilen ilk istekte access_type parametresini offline olarak ayarladığında döndürüldüğünü unutmayın.

Yanıt aşağıdaki alanları içerir:

Alanlar
access_token Uygulamanızın bir Google API isteğini yetkilendirmek için gönderdiği jeton.
expires_in Erişim jetonunun kalan ömrü (saniye cinsinden).
refresh_token Yeni bir erişim jetonu almak için kullanabileceğiniz bir jeton. Yenileme jetonları, kullanıcı erişimi iptal edene kadar geçerlidir. Bu alan da yalnızca Google'ın yetkilendirme sunucusuna gönderilen ilk istekte access_type parametresini offline olarak ayarlarsanız bu yanıtta görünür.
scope access_token tarafından verilen erişim kapsamları, boşlukla sınırlandırılmış, büyük/küçük harfe duyarlı dizelerden oluşan bir liste olarak ifade edilir.
token_type Döndürülen jetonun türü. Şu anda bu alanın değeri her zaman Bearer olarak ayarlanmıştır.

Aşağıdaki snippet'te örnek bir yanıt gösterilmektedir:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

Hatalar

Yetkilendirme kodunu bir erişim jetonuyla değiştirirken, beklenen yanıt yerine aşağıdaki hatayla karşılaşabilirsiniz. Yaygın hata kodları ve önerilen çözümler aşağıda listelenmiştir.

invalid_grant

Sağlanan yetkilendirme kodu geçersiz veya yanlış biçimde. Kullanıcıdan tekrar izin istemek için OAuth sürecini yeniden başlatarak yeni bir kod isteyin.

Google API'lerini çağırma

PHP

Aşağıdaki adımları tamamlayarak Google API'lerini çağırmak için erişim jetonunu kullanın:

  1. Yeni bir Google\Client nesnesine erişim jetonu uygulamanız gerekiyorsa (örneğin, erişim jetonunu bir kullanıcı oturumunda depoladıysanız) setAccessToken yöntemini kullanın:
    $client->setAccessToken($access_token);
  2. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Çağırmak istediğiniz API için oluşturucuya yetkili bir Google\Client nesnesi sağlayarak bir hizmet nesnesi oluşturursunuz. Örneğin, Drive API'yi çağırmak için:
    $drive = new Google\Service\Drive($client);
  3. Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istek gönderin. Örneğin, kimliği doğrulanmış kullanıcının Google Drive'ındaki dosyaları listelemek için:
    $files = $drive->files->listFiles(array())->getItems();

Python

Uygulamanız, erişim jetonu aldıktan sonra bu jetonu belirli bir kullanıcı hesabı veya hizmet hesabı adına API isteklerini yetkilendirmek için kullanabilir. Kullanıcıya özel yetkilendirme kimlik bilgilerini kullanarak çağırmak istediğiniz API için bir hizmet nesnesi oluşturun ve ardından bu nesneyi yetkili API isteklerinde bulunmak için kullanın.

  1. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. API'nin adı, sürümü ve kullanıcı kimlik bilgileriyle googleapiclient.discovery kitaplığının build yöntemini çağırarak bir hizmet nesnesi derlersiniz: Örneğin, Drive API'nin sürüm 3'ünü çağırmak için:
    from googleapiclient.discovery import build
    
    drive = build('drive', 'v2', credentials=credentials)
  2. Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istek gönderin. Örneğin, kimliği doğrulanmış kullanıcının Google Drive'ındaki dosyaları listelemek için:
    files = drive.files().list().execute()

Ruby

Uygulamanız, bir erişim jetonu aldıktan sonra bu jetonu belirli bir kullanıcı hesabı veya hizmet hesabı adına API isteklerinde bulunmak için kullanabilir. Kullanıcıya özel yetkilendirme kimlik bilgilerini kullanarak çağırmak istediğiniz API için bir hizmet nesnesi oluşturun ve ardından bu nesneyi yetkili API isteklerinde bulunmak için kullanın.

  1. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Örneğin, Drive API'nin 3. sürümünü çağırmak için:
    drive = Google::Apis::DriveV3::DriveService.new
  2. Hizmetteki kimlik bilgilerini ayarlayın:
    drive.authorization = credentials
  3. Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istek gönderin. Örneğin, kimliği doğrulanmış kullanıcının Google Drive'ındaki dosyaları listelemek için:
    files = drive.list_files

Alternatif olarak, bir yönteme options parametresi sağlanarak yöntem başına yetkilendirme sağlanabilir:

files = drive.list_files(options: { authorization: credentials })

Node.js

Bir erişim jetonu aldıktan ve bunu OAuth2 nesnesine ayarladıktan sonra, Google API'lerini çağırmak için nesneyi kullanın. Uygulamanız bu jetonu belirli bir kullanıcı hesabı veya hizmet hesabı adına API isteklerini yetkilendirmek için kullanabilir. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun.

const { google } = require('googleapis');

// Example of using Google Drive API to list filenames in user's Drive.
const drive = google.drive('v3');
drive.files.list({
  auth: oauth2Client,
  pageSize: 10,
  fields: 'nextPageToken, files(id, name)',
}, (err1, res1) => {
  if (err1) return console.log('The API returned an error: ' + err1);
  const files = res1.data.files;
  if (files.length) {
    console.log('Files:');
    files.map((file) => {
      console.log(`${file.name} (${file.id})`);
    });
  } else {
    console.log('No files found.');
  }
});

HTTP/REST

Uygulamanız bir erişim jetonu aldıktan sonra, API'nin gerektirdiği erişim kapsamları verilmişse bu jetonu belirli bir kullanıcı hesabı adına Google API'ye çağrı yapmak için kullanabilirsiniz. Bunu yapmak için access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API'ye yapılan bir isteğe erişim jetonunu dahil edin. Sorgu dizeleri sunucu günlüklerinde görünür olduğundan mümkün olduğunda HTTP üst bilgisi tercih edilir. Çoğu durumda, Google API'lerine yönelik ç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 kullanan 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

Burada, access_token sorgu dizesi parametresi kullanılarak kimliği doğrulanmış kullanıcı için aynı API'ye yapılan bir çağrı gösterilmektedir:

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 başlığı seçeneğinin kullanıldığı 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:

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

Eksiksiz örnek

Aşağıdaki örnekte, kullanıcı kimlik doğrulaması yaptıktan ve uygulamanın kullanıcının Drive meta verilerine erişmesine izin verdikten sonra kullanıcının Google Drive'ındaki dosyaların JSON biçimli bir listesi yazdırılır.

PHP

Bu örneği çalıştırmak için:

  1. API Consolesayfasında, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin, http://localhost:8080 ekleyin.
  2. Yeni bir dizin oluşturun ve dizinde değişiklik yapın. Örneğin:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. Composer'ı kullanarak PHP için Google API İstemci Kitaplığı'nı yükleyin:
    composer require google/apiclient:^2.10
  4. Aşağıdaki içerikle index.php ve oauth2callback.php dosyalarını oluşturun.
  5. Örneği, PHP'yi sunacak şekilde yapılandırılmış bir web sunucusuyla çalıştırın. PHP 5.6 veya daha yeni bir sürüm kullanıyorsanız PHP'nin yerleşik test web sunucusunu kullanabilirsiniz:
    php -S localhost:8080 ~/php-oauth2-example

index.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfig('client_secrets.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  $drive = new Google\Service\Drive($client);
  $files = $drive->files->listFiles(array())->getItems();
  echo json_encode($files);
} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

oauth2callback.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfigFile('client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (! isset($_GET['code'])) {
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

Python

Bu örnekte Flask çerçevesi kullanılmaktadır. http://localhost:8080 adresinde OAuth 2.0 akışını test etmenize olanak tanıyan bir web uygulaması çalıştırır. Bu URL'ye giderseniz dört bağlantı göreceksiniz:

  • API isteğini test etme: Bu bağlantı, örnek bir API isteğini yürütmeye çalışan bir sayfaya yönlendirir. Gerekirse yetkilendirme akışı başlatılır. Başarılı olursa sayfada API yanıtı gösterilir.
  • Yetkilendirme akışını doğrudan test etme: Bu bağlantı, kullanıcıyı yetkilendirme akışı üzerinden göndermeye çalışan bir sayfaya yönlendirir. Uygulama, kullanıcı adına yetkilendirilmiş API istekleri göndermek için izin ister.
  • Mevcut kimlik bilgilerini iptal et: Bu bağlantı, kullanıcının uygulamaya vermiş olduğu izinleri iptal eden bir sayfaya yönlendirir.
  • Flask oturumu kimlik bilgilerini temizle: Bu bağlantı, Flask oturumunda depolanan yetkilendirme kimlik bilgilerini temizler. Bu sayede, uygulamanıza izin vermiş bir kullanıcı yeni bir oturumda API isteği yürütmeye çalışırsa ne olacağını görebilirsiniz. Ayrıca, bir kullanıcı uygulamanıza verilen izinleri iptal etmişse ve uygulamanız iptal edilmiş bir erişim jetonuyla bir isteği yetkilendirmeye çalışsa bile uygulamanızın alacağı API yanıtını görmenize de olanak tanır.
# -*- coding: utf-8 -*-

import os
import flask
import requests

import google.oauth2.credentials
import google_auth_oauthlib.flow
import googleapiclient.discovery

# This variable specifies the name of a file that contains the OAuth 2.0
# information for this application, including its client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
API_SERVICE_NAME = 'drive'
API_VERSION = 'v2'

app = flask.Flask(__name__)
# Note: A secret key is included in the sample so that it works.
# If you use this code in your application, replace this with a truly secret
# key. See https://flask.palletsprojects.com/quickstart/#sessions.
app.secret_key = 'REPLACE ME - this value is here as a placeholder.'


@app.route('/')
def index():
  return print_index_table()


@app.route('/test')
def test_api_request():
  if 'credentials' not in flask.session:
    return flask.redirect('authorize')

  # Load credentials from the session.
  credentials = google.oauth2.credentials.Credentials(
      **flask.session['credentials'])

  drive = googleapiclient.discovery.build(
      API_SERVICE_NAME, API_VERSION, credentials=credentials)

  files = drive.files().list().execute()

  # Save credentials back to session in case access token was refreshed.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.jsonify(**files)


@app.route('/authorize')
def authorize():
  # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps.
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES)

  # The URI created here must exactly match one of the authorized redirect URIs
  # for the OAuth 2.0 client, which you configured in the API Console. If this
  # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch'
  # error.
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  authorization_url, state = flow.authorization_url(
      # Enable offline access so that you can refresh an access token without
      # re-prompting the user for permission. Recommended for web server apps.
      access_type='offline',
      # Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes='true')

  # Store the state so the callback can verify the auth server response.
  flask.session['state'] = state

  return flask.redirect(authorization_url)


@app.route('/oauth2callback')
def oauth2callback():
  # Specify the state when creating the flow in the callback so that it can
  # verified in the authorization server response.
  state = flask.session['state']

  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  # Use the authorization server's response to fetch the OAuth 2.0 tokens.
  authorization_response = flask.request.url
  flow.fetch_token(authorization_response=authorization_response)

  # Store credentials in the session.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  credentials = flow.credentials
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.redirect(flask.url_for('test_api_request'))


@app.route('/revoke')
def revoke():
  if 'credentials' not in flask.session:
    return ('You need to <a href="/authorize">authorize</a> before ' +
            'testing the code to revoke credentials.')

  credentials = google.oauth2.credentials.Credentials(
    **flask.session['credentials'])

  revoke = requests.post('https://oauth2.googleapis.com/revoke',
      params={'token': credentials.token},
      headers = {'content-type': 'application/x-www-form-urlencoded'})

  status_code = getattr(revoke, 'status_code')
  if status_code == 200:
    return('Credentials successfully revoked.' + print_index_table())
  else:
    return('An error occurred.' + print_index_table())


@app.route('/clear')
def clear_credentials():
  if 'credentials' in flask.session:
    del flask.session['credentials']
  return ('Credentials have been cleared.<br><br>' +
          print_index_table())


def credentials_to_dict(credentials):
  return {'token': credentials.token,
          'refresh_token': credentials.refresh_token,
          'token_uri': credentials.token_uri,
          'client_id': credentials.client_id,
          'client_secret': credentials.client_secret,
          'scopes': credentials.scopes}

def print_index_table():
  return ('<table>' +
          '<tr><td><a href="/test">Test an API request</a></td>' +
          '<td>Submit an API request and see a formatted JSON response. ' +
          '    Go through the authorization flow if there are no stored ' +
          '    credentials for the user.</td></tr>' +
          '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' +
          '<td>Go directly to the authorization flow. If there are stored ' +
          '    credentials, you still might not be prompted to reauthorize ' +
          '    the application.</td></tr>' +
          '<tr><td><a href="/revoke">Revoke current credentials</a></td>' +
          '<td>Revoke the access token associated with the current user ' +
          '    session. After revoking credentials, if you go to the test ' +
          '    page, you should see an <code>invalid_grant</code> error.' +
          '</td></tr>' +
          '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' +
          '<td>Clear the access token currently stored in the user session. ' +
          '    After clearing the token, if you <a href="/test">test the ' +
          '    API request</a> again, you should go back to the auth flow.' +
          '</td></tr></table>')


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification.
  # ACTION ITEM for developers:
  #     When running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

  # Specify a hostname and port that are set as a valid redirect URI
  # for your API project in the Google API Console.
  app.run('localhost', 8080, debug=True)

Ruby

Bu örnekte Sinatra çerçevesi kullanılmıştır.

require 'google/apis/drive_v3'
require 'sinatra'
require 'googleauth'
require 'googleauth/stores/redis_token_store'

configure do
  enable :sessions

  set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json')
  set :scope, Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY
  set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
  set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, '/oauth2callback')
end

get '/' do
  user_id = settings.client_id.id
  credentials = settings.authorizer.get_credentials(user_id, request)
  if credentials.nil?
    redirect settings.authorizer.get_authorization_url(login_hint: user_id, request: request)
  end
  drive = Google::Apis::DriveV3::DriveService.new
  files = drive.list_files(options: { authorization: credentials })
  "<pre>#{JSON.pretty_generate(files.to_h)}</pre>"
end

get '/oauth2callback' do
  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url
end

Node.js

Bu örneği çalıştırmak için:

  1. API Consolesayfasında, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin, http://localhost kodunu ekleyin.
  2. Bakım LTS'si, etkin LTS veya Node.js'nin mevcut sürümünün yüklü olduğundan emin olun.
  3. Yeni bir dizin oluşturun ve dizinde değişiklik yapın. Örneğin:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
  5. Aşağıdaki içeriğe sahip dosyaları main.js oluşturun.
  6. Şu örneği çalıştırın:
    node .\main.js

main.js

const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI.
 * To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

/* Global variable that stores user credential in this code example.
 * ACTION ITEM for developers:
 *   Store user's refresh token in your data store if
 *   incorporating this code into your real app.
 *   For more information on handling refresh tokens,
 *   see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens
 */
let userCredential = null;

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to Google's OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }

    // Receive the callback from Google's OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) { // An error response e.g. error=access_denied
        console.log('Error:' + q.error);
      } else { // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        /** Save credential to the global variable in case access token was refreshed.
          * ACTION ITEM: In a production app, you likely want to save the refresh token
          *              in a secure persistent database instead. */
        userCredential = tokens;

        // Example of using Google Drive API to list filenames in user's Drive.
        const drive = google.drive('v3');
        drive.files.list({
          auth: oauth2Client,
          pageSize: 10,
          fields: 'nextPageToken, files(id, name)',
        }, (err1, res1) => {
          if (err1) return console.log('The API returned an error: ' + err1);
          const files = res1.data.files;
          if (files.length) {
            console.log('Files:');
            files.map((file) => {
              console.log(`${file.name} (${file.id})`);
            });
          } else {
            console.log('No files found.');
          }
        });
      }
    }

    // Example on revoking a token
    if (req.url == '/revoke') {
      // Build the string for the POST request
      let postData = "token=" + userCredential.access_token;

      // Options for POST request to Google's OAuth 2.0 server to revoke a token
      let postOptions = {
        host: 'oauth2.googleapis.com',
        port: '443',
        path: '/revoke',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(postData)
        }
      };

      // Set up the request
      const postReq = https.request(postOptions, function (res) {
        res.setEncoding('utf8');
        res.on('data', d => {
          console.log('Response: ' + d);
        });
      });

      postReq.on('error', error => {
        console.log(error)
      });

      // Post the request with data
      postReq.write(postData);
      postReq.end();
    }
    res.end();
  }).listen(80);
}
main().catch(console.error);

HTTP/REST

Bu Python örneği, OAuth 2.0 web akışını göstermek için Flask çerçevesini ve Requests kitaplığını kullanır. Bu akış için Python için Google API İstemci Kitaplığı'nı kullanmanızı öneririz. (Python sekmesindeki örnekte istemci kitaplığı kullanılmaktadır.)

import json

import flask
import requests


app = flask.Flask(__name__)

CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123'  # Read from a file or environmental variable in a real app
SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly'
REDIRECT_URI = 'http://example.com/oauth2callback'


@app.route('/')
def index():
  if 'credentials' not in flask.session:
    return flask.redirect(flask.url_for('oauth2callback'))
  credentials = json.loads(flask.session['credentials'])
  if credentials['expires_in'] <= 0:
    return flask.redirect(flask.url_for('oauth2callback'))
  else:
    headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
    req_uri = 'https://www.googleapis.com/drive/v2/files'
    r = requests.get(req_uri, headers=headers)
    return r.text


@app.route('/oauth2callback')
def oauth2callback():
  if 'code' not in flask.request.args:
    auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
                '&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE)
    return flask.redirect(auth_uri)
  else:
    auth_code = flask.request.args.get('code')
    data = {'code': auth_code,
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'redirect_uri': REDIRECT_URI,
            'grant_type': 'authorization_code'}
    r = requests.post('https://oauth2.googleapis.com/token', data=data)
    flask.session['credentials'] = r.text
    return flask.redirect(flask.url_for('index'))


if __name__ == '__main__':
  import uuid
  app.secret_key = str(uuid.uuid4())
  app.debug = False
  app.run()

Yönlendirme URI'si doğrulama kuralları

Google, geliştiricilerin uygulamalarını güvenli tutmalarına yardımcı olmak amacıyla URI'leri yönlendirmek için aşağıdaki doğrulama kurallarını uygular. Yönlendirme URI'larınız bu kurallara uymalıdır. Aşağıda belirtilen alan, ana makine, yol, sorgu, şema ve kullanıcı bilgilerinin tanımı için RFC 3986 bölüm 3'e bakın.

Doğrulama kuralları
Şema

Yönlendirme URI'leri düz HTTP yerine HTTPS şemasını kullanmalıdır. Localhost URI'leri (localhost IP adresi URI'leri dahil) bu kuraldan muaftır.

Düzenleyen

Ana makineler ham IP adresi olamaz. Yerel ana makine 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 alan adları “googleusercontent.com” olamaz.
  • Yönlendirme URI'ları, alan adının sahibi uygulama olmadığı sürece URL kısaltıcı alan adları (ör. goo.gl) içeremez. Dahası, daha kısa alan adına sahip bir uygulama bu alan adına yönlendirme yapmayı seçerse söz konusu yönlendirme URI'sinin yolunda “/google-callback/” içermesi veya “/google-callback” ile bitmesi gerekir.
  • Kullanıcı Bilgileri

    Yönlendirme URI'leri kullanıcı bilgileri alt bileşenini içeremez.

    Yol

    Yönlendirme URI'leri, “/..” veya “\..” ya da URL kodlaması ile temsil edilen bir yol geçişi (dizin geri izleme olarak da adlandırılır) içeremez.

    Sorgu

    Yönlendirme URI'leri açık yönlendirmeler içeremez.

    Parça

    Yönlendirme URI'leri, parça bileşenini içeremez.

    Karakterler Yönlendirme URI'leri aşağıdakiler de dahil olmak üzere belirli karakterleri içeremez:
    • Joker karakterler ('*')
    • Yazdırılamayan ASCII karakterleri
    • Geçersiz yüzde kodlamaları (bir yüzde işaretinin ve ardından iki onaltılık hanenin URL kodlama biçimine uymayan herhangi bir yüzde kodlaması)
    • Boş karakterler (kodlanmış bir NULL karakteri, ör. %00, %C0%80)

    Artımlı yetkilendirme

    OAuth 2.0 protokolünde, uygulamanız kapsamlara göre tanımlanan kaynaklara erişim için yetkilendirme ister. Kaynaklar için ihtiyaç duyduğunuz anda yetkilendirme istemek bir en iyi kullanıcı deneyimi uygulaması olarak kabul edilir. Google'ın yetkilendirme sunucusu bu uygulamayı mümkün kılmak için artımlı yetkilendirmeyi destekler. Bu özellik, gerektiğinde kapsam istemenize olanak tanır. Kullanıcı yeni kapsam için izin verirse kullanıcının projeye 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ı denemelerine ve mix'ler oluşturmasına olanak tanıyan bir uygulama, oturum açma işlemi sırasında çok az kaynağa ihtiyaç duyabilir. Yalnızca oturum açan kişinin adından başka bir kaynak yeterli olmayabilir. Ancak, tamamlanmış bir karışımı kaydetmek için kullanıcının Google Drive'ına erişim gerekir. Çoğu kullanıcı, yalnızca uygulamanın gerçekten ihtiyaç duyduğu sırada Google Drive'ına erişim izni isteseydi bunu doğal bulurdu.

    Bu durumda, oturum açma sırasında uygulama, temel oturum açma gerçekleştirmek için openid ve profile kapsamlarını isteyebilir ve daha sonra, bir karışımı kaydetmek için ilk istek sırasında https://www.googleapis.com/auth/drive.file kapsamını isteyebilir.

    Artımlı yetkilendirmeyi uygulamak için erişim jetonu istemeyle ilgili normal akışı tamamlarsınız ancak yetkilendirme isteğinin daha önce verilmiş kapsamları içerdiğinden emin olun. Bu yaklaşım, uygulamanızın birden fazla erişim jetonunu yönetmek zorunda kalmamasını sağlar.

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

    • Bu jeton, birleştirilmiş yeni yetkilendirmeye dahil edilen kapsamlardan herhangi birine karşılık gelen kaynaklara erişmek için kullanılabilir.
    • Bir erişim jetonu almak amacıyla 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şik yetkilendirme, farklı istemcilerden izin 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 verirse ve daha sonra bir mobil istemci aracılığıyla aynı uygulamaya başka bir kapsam daha verdiyse birleştirilmiş yetkilendirme her iki kapsamı da içerir.
    • Birleşik 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.

    1. Adım: Yetkilendirme parametrelerini ayarlayın bölümündeki dile özgü kod örnekleri ve 2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendirme bölümündeki örnek HTTP/REST yönlendirme URL'sinin tamamı artımlı yetkilendirme kullanır. Aşağıdaki kod örnekleri, artımlı yetkilendirmeyi kullanmak için eklemeniz gereken kodu da göstermektedir.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    Python'da, yetkilendirme isteğinin önceden verilmiş kapsamları içerdiğinden emin olmak için include_granted_scopes anahtar kelime bağımsız değişkenini true olarak ayarlayın. Aşağıdaki örnekte gösterildiği gibi, ayarladığınız tek anahtar kelime bağımsız değişkeni include_granted_scopes olmayabilir.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Ruby

    auth_client.update!(
      :additional_parameters => {"include_granted_scopes" => "true"}
    )

    Node.js

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    HTTP/REST

    GET https://accounts.google.com/o/oauth2/v2/auth?
      client_id=your_client_id&
      response_type=code&
      state=state_parameter_passthrough_value&
      scope=https%3A//www.googleapis.com/auth/drive.file&
      redirect_uri=https%3A//oauth2.example.com/code&
      prompt=consent&
      include_granted_scopes=true

    Erişim jetonunu yenileme (çevrimdışı erişim)

    Erişim jetonlarının süresi periyodik olarak dolar ve ilgili API isteği için geçersiz kimlik bilgileri haline gelir. Bir erişim jetonunu, jetonla ilişkili kapsamlara çevrimdışı erişim isteğinde bulunduysanız kullanıcıdan izin istemeden (kullanıcının bulunmadığı durumlar dahil) yenileyebilirsiniz.

    • Google API İstemci Kitaplığı kullanırsanız istemci nesnesi, bu nesneyi çevrimdışı erişim için yapılandırdığınız sürece erişim jetonunu gerektiği şekilde yeniler.
    • İstemci kitaplığı kullanmıyorsanız kullanıcıyı Google'ın OAuth 2.0 sunucusuna yönlendirirken access_type HTTP sorgu parametresini offline olarak ayarlamanız gerekir. Bu durumda, bir erişim jetonu için yetkilendirme kodunu değiştirdiğinizde Google'ın yetkilendirme sunucusu bir yenileme jetonu döndürür. Ardından, erişim jetonunun süresi dolarsa (veya başka bir zamanda) yeni bir erişim jetonu almak için yenileme jetonu kullanabilirsiniz.

    Kullanıcı mevcut değilken Google API'ye erişmesi gereken tüm uygulamaların çevrimdışı erişim istemesi zorunludur. Örneğin, önceden belirlenmiş zamanlarda yedekleme hizmetleri gerçekleştiren veya işlemler yürüten bir uygulamanın, kullanıcı yokken erişim jetonunu yenileyebilmesi gerekir. Varsayılan erişim stili online olarak adlandırılır.

    Sunucu tarafı web uygulamaları, yüklü uygulamalar ve cihazların tümü, yetkilendirme işlemi sırasında yenileme jetonları alır. Yenileme jetonları genellikle istemci tarafı (JavaScript) web uygulamalarında kullanılmaz.

    PHP

    Uygulamanızın bir Google API'ye çevrimdışı erişmesi gerekiyorsa API istemcisinin erişim türünü offline olarak ayarlayın:

    $client->setAccessType("offline");

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiğinde yeniler.

    Python

    Python'da, kullanıcıdan yeniden izin istemek zorunda kalmadan erişim jetonunu yenileyebileceğinizden emin olmak için access_type anahtar kelime bağımsız değişkenini offline olarak ayarlayın. Aşağıdaki örnekte gösterildiği gibi, belirlediğiniz tek anahtar kelime bağımsız değişkeni access_type olmayabilir.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiğinde yeniler.

    Ruby

    Uygulamanızın bir Google API'ye çevrimdışı erişmesi gerekiyorsa API istemcisinin erişim türünü offline olarak ayarlayın:

    auth_client.update!(
      :additional_parameters => {"access_type" => "offline"}
    )

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiğinde yeniler.

    Node.js

    Uygulamanızın bir Google API'ye çevrimdışı erişmesi gerekiyorsa API istemcisinin erişim türünü offline olarak ayarlayın:

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiğinde yeniler.

    Erişim jetonlarının süresi dolar. Bu kitaplık, süresi dolmak üzereyken yeni bir erişim jetonu almak için otomatik olarak yenileme jetonu kullanır. Her zaman en yeni jetonları sakladığınızdan emin olmanın kolay bir yolu jeton etkinliğini kullanmaktır:

    oauth2Client.on('tokens', (tokens) => {
      if (tokens.refresh_token) {
        // store the refresh_token in your secure persistent database
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
    });

    Bu jeton etkinliği yalnızca ilk yetkilendirmede gerçekleşir ve yenileme jetonunu almak için generateAuthUrl yöntemini çağırırken access_type öğenizi offline olarak ayarlamanız gerekir. Uygulamanıza gerekli izinleri daha önce, yenileme jetonu almak için uygun kısıtlamaları ayarlamadan verdiyseniz yeni bir yenileme jetonu almak için uygulamayı yeniden yetkilendirmeniz gerekir.

    refresh_token öğesini daha sonra ayarlamak için setCredentials yöntemini kullanabilirsiniz:

    oauth2Client.setCredentials({
      refresh_token: `STORED_REFRESH_TOKEN`
    });
    

    İstemci bir yenileme jetonuna sahip olduğunda, erişim jetonları bir sonraki API çağrısında otomatik olarak alınır ve yenilenir.

    HTTP/REST

    Uygulamanız, bir erişim jetonunu yenilemek için Google'ın yetkilendirme sunucusuna (https://oauth2.googleapis.com/token) aşağıdaki parametreleri içeren bir HTTPS POST isteği gönderir:

    Alanlar
    client_id API Consolekaynağından alınan istemci kimliği.
    client_secret API Consoleöğesinden alınan istemci gizli anahtarı.
    grant_type OAuth 2.0 spesifikasyonunda tanımlandığı gibi, bu alanın değeri refresh_token olarak ayarlanmalıdır.
    refresh_token Yetkilendirme kodu değişiminden döndürülen yenileme jetonu.

    Aşağıdaki snippet'te örnek bir istek gösterilmektedir:

    POST /token HTTP/1.1
    Host: oauth2.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=your_client_id&
    client_secret=your_client_secret&
    refresh_token=refresh_token&
    grant_type=refresh_token

    Kullanıcı, uygulamaya verilen erişimi iptal etmediği sürece jeton sunucusu, yeni erişim jetonu içeren bir JSON nesnesi döndürür. Aşağıdaki snippet'te örnek bir yanıt gösterilmektedir:

    {
      "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
      "expires_in": 3920,
      "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
      "token_type": "Bearer"
    }

    Verilecek yenileme jetonu sayısı için sınırlar olduğunu unutmayın. Bu sınırlar, istemci/kullanıcı kombinasyonu başına bir sınır ve tüm istemcilerde kullanıcı başına bir sınırdır. Yenileme jetonlarını uzun vadeli depolama alanına kaydetmeniz ve geçerli oldukları sürece kullanmaya devam etmeniz gerekir. Uygulamanız çok fazla yenileme jetonu isterse bu sınırlarla karşılaşabilir ve bu durumda eski yenileme jetonları çalışmayı durdurur.

    Jetonu iptal etme

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

    Bir uygulamanın, kendisine verilen erişimi programlı bir şekilde iptal etmesi de mümkündür. Programlı iptal; kullanıcının abonelikten çıktığı, uygulamayı kaldırdığı veya uygulamanın gerektirdiği API kaynaklarının önemli ölçüde değiştiği durumlarda önemlidir. Başka bir deyişle, kaldırma sürecinde uygulamaya daha önce verilmiş olan izinlerin kaldırılması için bir API isteği gönderilebilir.

    PHP

    Bir jetonu programatik olarak iptal etmek için revokeToken() çağrısı yapın:

    $client->revokeToken();

    Python

    Bir jetonu programatik olarak iptal etmek için https://oauth2.googleapis.com/revoke için jetonu parametre olarak içeren ve Content-Type üst bilgisini ayarlayan bir istek yapın:

    requests.post('https://oauth2.googleapis.com/revoke',
        params={'token': credentials.token},
        headers = {'content-type': 'application/x-www-form-urlencoded'})

    Ruby

    Bir jetonu programatik olarak iptal etmek için oauth2.revoke uç noktasına bir HTTP isteği gönderin:

    uri = URI('https://oauth2.googleapis.com/revoke')
    response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
    

    Bu jeton bir erişim jetonu veya yenileme jetonu olabilir. Jeton bir erişim jetonuysa ve ilgili bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

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

    Node.js

    Bir jetonu programatik olarak iptal etmek için /revoke uç noktasına HTTPS POST isteği yapın:

    const https = require('https');
    
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;
    
    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    
    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });
    
    postReq.on('error', error => {
      console.log(error)
    });
    
    // Post the request with data
    postReq.write(postData);
    postReq.end();
    

    Jeton parametresi bir erişim jetonu veya yenileme jetonu olabilir. Jeton bir erişim jetonuysa ve ilgili bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

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

    HTTP/REST

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

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

    Bu jeton bir erişim jetonu veya yenileme jetonu olabilir. Jeton bir erişim jetonuysa ve ilgili bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

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