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 yetkilendirmesi uygulamak amacıyla 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 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ışı özellikle kullanıcı yetkilendirmesi içindir. Gizli bilgileri depolayabilecek ve durumu koruyabilecek uygulamalar için tasarlanmıştır. Doğru şekilde 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ı da sıklıkla API isteklerini yetkilendirmek için hizmet hesaplarını kullanır. Bu, özellikle kullanıcıya özel veriler yerine proje tabanlı verilere erişmek için Cloud API'lerinin çağrılmasına neden olur. Web sunucusu uygulamaları, kullanıcı yetkilendirmeyle birlikte hizmet hesaplarını kullanabilir.

İstemci kitaplıkları

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

Uygulamanızın OAuth 2.0 akışını yönetmek için bir Google API İstemci Kitaplığı kullandığınızda istemci kitaplığı, uygulamanın normalde kendisinin işlemesi gereken pek çok işlem gerçekleştirir. Örneğin, bu izin, uygulamanın depolanan erişim jetonlarını ne zaman kullanabileceğini veya yenileyebileceğini ve uygulamanın ne zaman izin alması gerektiğini belirler. İstemci kitaplığı ayrıca doğru yönlendirme URL'leri oluşturur ve erişim jetonları için yetkilendirme kodları takası yapan yönlendirme işleyicilerinin 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ş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 arama yapmak için aramayı kullanın veya ait olduğu ürün ailesinde Tümünü Görüntüle'yi tıklayın.
  4. Etkinleştirmek istediğiniz API'yi seçip Etkinleştir düğmesini tıklayın.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Yetkilendirme kimlik bilgileri oluşturma

Google API'lerine erişmek için OAuth 2.0 kullanan tüm uygulamaların, uygulamayı Google'ın OAuth 2.0 sunucusuna tanımlayan yetkilendirme kimlik bilgilerine sahip olması gerekir. Aşağıdaki adımlarda projeniz için kimlik 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 ve Oluştur'u tıklayın. PHP, Java, Python, Yakut ve .NET gibi dil ve çerçeveler kullanan uygulamalar, yetkilendirilmiş 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 yerel makineye işaret eden URI'lar belirtebilirsiniz (ör. http://localhost:8080). Bunu göz önünde bulundurarak, bu dokümandaki tüm örneklerin yönlendirme URI'si olarak http://localhost:8080 öğesini kullandığını göz önünde bulundurun.

    Uygulamanızın yetkilendirme kodlarını sayfadaki diğer kaynaklara ifşa etmemesi için uygulamanızın kimlik doğrulama uç noktalarını tasarlamanızı öneririz.

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 depolayı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 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.

Uygulamanızın, artımlı yetkilendirme yoluyla yetkilendirme kapsamlarına erişim isteğinde bulunmasını da öneririz. Bu durumda, uygulamanız bağlamdaki kullanıcı verilerine erişim isteğinde bulunur. Bu en iyi uygulama, kullanıcıların uygulamanızın istediği erişime neden ihtiyaç duyduğunu daha kolay anlamalarına yardımcı olur.

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

Dile özgü gereksinimler

Bu dokümandaki kod örneklerini çalıştırmak için bir Google hesabına, internet erişimine ve web tarayıcısına ihtiyacınız vardır. API istemci kitaplıklarından birini kullanıyorsanız aşağıdaki dile özgü gereksinimleri de inceleyebilirsiniz.

PHP

Bu dokümandaki PHP kod örneklerini çalıştırmak için aşağıdakiler gereklidir:

  • Komut satırı arayüzü (KSA) ve JSON uzantısı yüklü olarak PHP 5.6 veya sonraki sürümler.
  • Oluşturucu bağımlı yönetim aracı.
  • PHP için Google API'leri İstemci Kitaplığı

    composer require google/apiclient:^2.10

Python

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

  • Python 2.6 veya üzeri
  • Pip paketi 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 dokümandaki Roku kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız vardır:

  • Yakut 2.2.2 veya üzeri
  • Yakut için Google API'leri İstemci Kitaplığı:

    gem install google-api-client
  • Sinatra Wild web uygulaması çerçevesi.

    gem install sinatra

Node.js

Bu dokümanda Node.js kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız olacaktır:

  • Bakım LTS'si, 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 bir kullanıcı adına API isteği gerçekleştirmek için 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.

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

  1. Uygulamanız gereken izinleri belirler.
  2. Uygulamanız, kullanıcıyı istenen izinlerle birlikte Google'a yönlendirir.
  3. Uygulamaya izin verilip verilmeyeceğini kullanıcı belirler.
  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 isteklerinde bulunmak için gereken jetonları alır.

1. Adım: Yetkilendirme parametrelerini ayarlayın

İlk adımda yetkilendirme isteği oluşturun. Bu istek, uygulamanızı tanımlayan ve kullanıcıdan uygulamanıza vermesi istenecek izinleri tanımlayan parametreleri ayarlar.

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

Aşağıdaki sekmeler, web sunucusu uygulamaları için desteklenen yetkilendirme parametrelerini tanımlar. Dile özel ö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 için yetkilendirme kimlik bilgileri oluşturma bölümüne bakın.) Nesne, uygulamanızın erişmek istediği izinleri ve Google'ın OAuth 2.0 sunucusundan gelen yanıtı işleyecek uygulamanızın kimlik 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 bir 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" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt('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 pagebölümünde bulabilirsiniz.

PHP'de, bir client_secret.json dosyasından yetkilendirme kimlik bilgileri 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önlendireceğini belirler. Değer, istemcinizin API Console Credentials 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.

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

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

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

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.

access_type Önerilen

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri varsayılan değer olan online ve offline'dır.

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, bu dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız ilk kez jetonlarla yetkilendirme kodu değiştirdiğinde Google yetkilendirme sunucusuna bir yenileme jetonu ve erişim jetonu döndürmesi talimatını verir.

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 sunucusu 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 redirect_uri, 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, 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.

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ı yetkilendirmeyi kullanmasına olanak tanır. Bu parametreyi true değerine 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.

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

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

$client->setApprovalPrompt('consent');

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.

Python

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

Kod, yetkilendirme kimlik bilgileri oluşturduktan sonra indirdiğiniz client_secret.json dosyasındaki bilgileri kullanarak uygulamanızı tanımlayan bir Flow nesnesi oluşturur. Bu nesne aynı zamanda uygulamanızın erişim izni istediği kapsamları ve Google'ın OAuth 2.0 sunucusundan gelen yanıtı işleyecek uygulamanızın kimlik 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 bir 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 pagebölümünde bulabilirsiniz.

Python'da, istemci kimliğini bir client_secret.json dosyasından almak için from_client_secrets_file yöntemini çağırın. (İstemci yöntemini başlangıçta istemci gizli anahtarları dosyasında göründüğü şekliyle ileten ancak dosyaya 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önlendireceğini belirler. Değer, istemcinizin API Console Credentials 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.

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

Python'da, kapsam listesini belirtmek için client_id'i ayarlamak amacıyla 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'])

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.

access_type Önerilen

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri varsayılan değer olan online ve offline'dır.

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, bu dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız ilk kez jetonlarla yetkilendirme kodu değiştirdiğinde Google yetkilendirme sunucusuna bir yenileme jetonu ve erişim jetonu döndürmesi talimatını verir.

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 sunucusu 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 redirect_uri, 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, 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.

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ı yetkilendirmeyi kullanmasına olanak tanır. Bu parametreyi true değerine 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.

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

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

Ruby

Uygulamanızda bir istemci nesnesi yapılandırmak için oluşturduğunuz client_secrets.json dosyasını kullanın. Bir istemci nesnesi yapılandırırken, uygulamanızın erişmesi gereken kapsamları, OAuth 2.0 sunucusundan alınan yanıtı işleyecek uygulamanızın kimlik uç noktasının URL'siyle birlikte belirtirsiniz.

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

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'

client_secrets = Google::APIClient::ClientSecrets.load
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'http://www.example.com/oauth2callback',
  :additional_parameters => {
    "access_type" => "offline",         # offline access
    "include_granted_scopes" => "true"  # incremental auth
  }
)

Uygulamanız, OAuth 2.0 işlemlerini gerçekleştirmek (örneğin, yetkilendirme isteği URL'leri oluşturmak ve erişim jetonlarını HTTP isteklerine uygulamak) için istemci nesnesini kullanır.

Node.js

Aşağıdaki kod snippet'i, yetkilendirme isteğindeki parametreleri tanımlayan bir google.auth.OAuth2 nesnesi oluşturur.

Bu nesne, uygulamanızı tanımlamak için client_secret.json dosyanızdaki bilgileri kullanır. Erişim jetonu almak için kullanıcıdan izin istemek amacıyla kullanıcıyı izin sayfasına yönlendirirsiniz. İzin sayfası URL'si oluşturmak için:

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 döndürülür. Daha fazla bilgiyi burada bulabilirsiniz.

HTTP/REST

Google'ın OAuth 2.0 uç noktası https://accounts.google.com/o/oauth2/v2/auth adresindedir. 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 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 Console Credentials 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

Google OAuth 2.0 uç noktasının bir 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, 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.

access_type Önerilen

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir. Geçerli parametre değerleri varsayılan değer olan online ve offline'dır.

Kullanıcı tarayıcıda olmadığında uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın. Bu, bu dokümanın ilerleyen bölümlerinde açıklanan erişim jetonlarını yenileme yöntemidir. Bu değer, uygulamanız ilk kez jetonlarla yetkilendirme kodu değiştirdiğinde Google yetkilendirme sunucusuna bir yenileme jetonu ve erişim jetonu döndürmesi talimatını verir.

state Önerilen

Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusu 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 redirect_uri, 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, 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 parametreyi true değerine 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ısı olarak ayarlayın.

prompt İsteğe bağlı

Kullanıcıya sunmak için boşlukla sınırlandırılmış, büyük/küçük harfe duyarlı bir istem listesi. Bu parametreyi belirtmezseniz kullanıcıdan yalnızca 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.

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. Bu durum genellikle uygulamanızın ilk olarak kullanıcının verilerine 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 olmadığı ek kaynaklara 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 adresine yönlendir:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

Aşağıdaki örnekte, Flask web uygulama ç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 = auth_client.authorization_uri.to_s
  2. Kullanıcıyı auth_uri adresine yönlendir.

Node.js

  1. Google'ın OAuth 2.0 sunucusundan erişim isteğinde bulunmak için, 1. adımda generateAuthUrl yönteminden oluşturulan authorizationUrl URL'sini kullanın.
  2. Kullanıcıyı authorizationUrl adresine yönlendir.
    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şimi verip veremeyeceğine karar verir. Bu aşamada Google, uygulamanızın adı ve kullanıcının yetkilendirme kimlik bilgileriyle erişim izni istediği Google API hizmetlerinin gösterildiği ve erişim izinlerinin kapsamlarını özetleyen 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 gelen yanıt beklenirken uygulamanızın herhangi bir erişim izni verilip verilmediğini beklediği için uygulamanızın bu aşamada bir şey yapmasına gerek yoktur. 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ğiyle ilgili daha fazla bilgi için Google Workspace verilerine hangi üçüncü taraf uygulamalarının 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ş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 Vakfı'nı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 Vakfı'nı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.

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.

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

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ıtta bir yetkilendirme kodu yer alır. Kullanıcı isteği onaylamazsa yanıtta bir hata mesajı gösterilir. Web sunucusuna döndürülen yetkilendirme kodu veya hata mesajı, aşağıda gösterildiği gibi sorgu dizesinde 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önlendirilmeniz gerekir. Bu durumda, yerel makineniz söz konusu adreste dosya sunmadığı sürece 404 NOT FOUND hatası alırsınız. Bir sonraki adım, kullanıcı uygulamanıza tekrar yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha ayrıntılı bilgi sağlar.

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

Web sunucusu yetkilendirme kodunu aldıktan sonra, bir erişim jetonu için yetkilendirme kodunu takas edebilir.

PHP

Bir erişim jetonu için yetkilendirme kodu değiştirmek amacıyla 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, bir yanıt jetonundaki 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

Bir erişim jetonu için yetkilendirme kodu değiştirmek amacıyla fetch_access_token! yöntemini kullanın:

auth_client.code = auth_code
auth_client.fetch_access_token!

Node.js

Bir erişim jetonu için yetkilendirme kodu değiştirmek amacıyla 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

Bir erişim jetonuyla yetkilendirme kodu değiş tokuşu yapmak 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 API Consoleadresinden elde edilen istemci kimliği.
client_secret API Console Credentials pageadresinden alınan istemci sırrı.
code İlk istekten 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 Projeniz için belirtilen client_id için API ConsoleCredentials page içinde 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ü bir erişim jetonu ve yenileme jetonu içeren bir JSON nesnesi döndürerek yanıt verir. Yenileme jetonunun yalnızca uygulamanız, Google' yetkilendirme sunucusuna gönderilen ilk istekte access_type parametresini offline değerine ayarladığında döndürülür.

Yanıtta şu alanlar yer alır:

Alanlar
access_token Uygulamanızın bir Google API isteğini yetkilendirmek için gönderdiği jeton.
expires_in Saniye cinsinden erişim jetonunun kalan ömrü.
refresh_token Yeni bir erişim jetonu almak için kullanabileceğiniz jeton. Yenileme jetonları, kullanıcı erişimi iptal edene kadar geçerlidir. Bu yanıtta bu alan yalnızca ilk parametreyi Google'ın yetkilendirme sunucusu için access_type parametresini offline olarak ayarlarsanız bulunur.
scope access_token tarafından verilen erişim kapsamları; boşlukla sınırlandırılmış ve büyük/küçük harfe duyarlı dizelerin listesi olarak belirtilir.
token_type Döndürülen jetonun türü. Şu anda bu alanın değeri her zaman Bearer olarak ayarlıdı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"
}

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. Aramak istediğiniz API için bir hizmet nesnesi oluşturun. çağırmak istediğiniz API'nin oluşturucusuna 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 nesnesi tarafından sağlanan 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 bir erişim jetonu aldıktan sonra, belirli bir kullanıcı hesabı veya hizmet hesabı adına API isteklerini yetkilendirmek için bu jetonu kullanabilir. Aramak istediğiniz API için hizmet nesnesi oluşturmak amacıyla kullanıcıya özel yetkilendirme kimlik bilgilerini kullanın ve ardından bu nesneyi yetkili API isteklerinde bulunun.

  1. Aramak istediğiniz API için bir hizmet nesnesi oluşturun. API'nin adı ve sürümü ile googleapiclient.discovery kitaplığının build yöntemini çağırarak bir hizmet nesnesi oluşturursunuz: Örneğin, Drive API'nin 2. sürümünü çağırmak için:
    from googleapiclient.discovery import build
    
    drive = build('drive', 'v2', credentials=credentials)
  2. Hizmet nesnesi tarafından sağlanan 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

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

  1. Aramak istediğiniz API için bir hizmet nesnesi oluşturun. Örneğin, Drive API'nin 2. sürümünü çağırmak için:
    drive = Google::Apis::DriveV2::DriveService.new
  2. Hizmetteki kimlik bilgilerini ayarlayın:
    drive.authorization = auth_client
  3. Hizmet nesnesi tarafından sağlanan 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, options parametresi bir yönteme sağlanarak yöntem bazında sağlanabilir:

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

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

Tam örnek

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

PHP

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

  1. API Consoleiçinde, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin, http://localhost:8080 URL'sini ekleyin.
  2. Yeni bir dizin oluşturup dizini değiştirin. Örneğin:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. Creater 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

dizin.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 üzerinde 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örürsünüz:

  • API isteğini test etme: Bu bağlantı, örnek bir API isteğini yürütmeye çalışan bir sayfaya yönlendirme yapar. Gerekirse yetkilendirme akışını başlatır. Başarılı olursa sayfada API yanıtı görüntülenir.
  • Yetkilendirme akışını doğrudan test edin: Bu bağlantı, kullanıcıyı yetkilendirme akışı üzerinden göndermeye çalışan bir sayfaya işaret eder. Uygulama, kullanıcı adına yetkili API istekleri göndermek için izin ister.
  • Mevcut kimlik bilgilerini iptal edin: 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. Böylece, uygulamanız için izin vermiş olan bir kullanıcı yeni bir oturumda API isteği yürütmeye çalışsaydı ne olacağını görebilirsiniz. Ayrıca, kullanıcı uygulamanıza verilen izinleri iptal etmişse ve uygulamanız yine de iptal edilmiş erişim jetonuyla bir isteği yetkilendirmeye çalıştıysa uygulamanızın alacağı API yanıtını görmenize 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ılmaktadır.

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'
require 'json'
require 'sinatra'

enable :sessions
set :session_secret, 'setme'

get '/' do
  unless session.has_key?(:credentials)
    redirect to('/oauth2callback')
  end
  client_opts = JSON.parse(session[:credentials])
  auth_client = Signet::OAuth2::Client.new(client_opts)
  drive = Google::Apis::DriveV2::DriveService.new
  files = drive.list_files(options: { authorization: auth_client })
  "<pre>#{JSON.pretty_generate(files.to_h)}</pre>"
end

get '/oauth2callback' do
  client_secrets = Google::APIClient::ClientSecrets.load
  auth_client = client_secrets.to_authorization
  auth_client.update!(
    :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
    :redirect_uri => url('/oauth2callback'))
  if request['code'] == nil
    auth_uri = auth_client.authorization_uri.to_s
    redirect to(auth_uri)
  else
    auth_client.code = request['code']
    auth_client.fetch_access_token!
    auth_client.client_secret = nil
    session[:credentials] = auth_client.to_json
    redirect to('/')
  end
end

Node.js

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

  1. API Consoleiçinde, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin, http://localhost URL'sini 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şturup dizini değiştirin. Ö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çerikle main.js dosyalarını oluşturun.
  6. Örneği çalıştırın:
    node .\main.js

ana.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 İstekler kitaplığını kullanır. Bu akışta 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()

URI URI'lerini doğrulama kuralları

Google, geliştiricilerin uygulamalarını güvende tutmalarına yardımcı olmak için URI'leri yönlendirmek üzere aşağıdaki doğrulama kurallarını uygular. Yönlendirme URI'leriniz bu kurallara uygun olmalıdır. 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 değil, HTTPS şemasını kullanmalıdır. Localhost URI'ları (localhost IP adresi URI'leri dahil) bu kuraldan muaftır.

Toplantı sahibi

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 ait olmadığı sürece Yönlendirme URI'ları URL kısaltıcı alan adları (ör. goo.gl) içeremez. Ayrıca, kısaltılmış alan adına sahip bir uygulama bu alan adına yönlendirme yapmayı seçerse söz konusu yönlendirme URI'si yolunda “/google-callback/” ifadesi bulunmalı veya “/google-callback” ile bitmelidir.
  • Kullanıcı Bilgileri

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

    Yol

    Yönlendirme URI'leri, “/..” veya “\..” ya da URL kodlamalarıyla temsil edilen bir yol geçişi (dizin geri izlemesi 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 dahil belirli karakterleri 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.

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

    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 verirse ve ardından mobil istemci üzerinden aynı uygulamaya başka bir kapsam verirse, birleştirilmiş yetkilendirme 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.

    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önlendirin bölümündeki örnek HTTP/REST yönlendirme URL'si, ek yetkilendirme kullanır. Aşağıdaki kod örnekleri, ek yetkilendirme kullanmak için eklemeniz gereken kodu da göstermektedir.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    Python'da, yetkilendirme isteğinin daha önce verilen kapsamları içerdiğinden emin olmak için include_granted_scopes anahtar kelime bağımsız değişkenini true olarak ayarlayın. include_granted_scopes büyük olasılıkla, aşağıdaki örnekte gösterildiği gibi, belirlediğiniz tek anahtar kelime bağımsız değişkeni 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 dolar ve ilgili API isteği için geçersiz kimlik bilgileri haline gelir. Jetonla ilişkili kapsamlara çevrimdışı erişim isteğinde bulunduysanız kullanıcı izni istemeden (kullanıcının olmadığı durumlar da dahil) erişim jetonunu yenileyebilirsiniz.

    • Bir Google API İstemci Kitaplığı kullanıyorsanız istemci nesnesi, bu nesneyi çevrimdışı erişim için yapılandırdığınız sürece erişim jetonunu gereken ş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, erişim jetonunun 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ı olmadığında Google API'ye erişmesi gereken tüm uygulamalar için çevrimdışı erişim isteğinde bulunmak gerekir. Örneğin, yedekleme hizmetleri gerçekleştiren veya önceden belirlenmiş zamanlarda işlem gerçekleştiren bir uygulamanın, kullanıcı mevcut olmadığında erişim jetonunu yenileyebilmesi gerekir. Varsayılan erişim stiline online adı verilir.

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

    PHP

    Uygulamanız bir Google API'sine çevrimdışı erişime ihtiyaç duyuyorsa 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 çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiği gibi yeniler.

    Python

    Python'da, erişim izni için kullanıcıyı yeniden 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. access_type, aşağıdaki örnekte gösterildiği gibi, belirlediğiniz tek anahtar kelime bağımsız değişkeni 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 çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiği gibi yeniler.

    Ruby

    Uygulamanız bir Google API'sine çevrimdışı erişime ihtiyaç duyuyorsa 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 çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiği gibi yeniler.

    Node.js

    Uygulamanız bir Google API'sine çevrimdışı erişime ihtiyaç duyuyorsa 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 çevrimdışıyken kullanıcı adına Google API'lerine erişmek için API istemcisini kullanmaya devam edebilirsiniz. İstemci nesnesi, erişim jetonunu gerektiği gibi yeniler.

    Erişim jetonlarının süresi dolar. Bu kitaplık, geçerlilik süresi dolmak üzereyken yeni erişim jetonu almak için otomatik olarak bir yenileme jetonu kullanır. Her zaman en yeni jetonları depoladığı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. Yenileme jetonu almak için gerekli kısıtlamaları ayarlamadan uygulamanıza gerekli izinleri zaten verdiyseniz uygulamayı yeni bir yenileme jetonu almak için yeniden yetkilendirmeniz gerekir.

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

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

    İstemci bir yenileme jetonu aldıktan sonra, erişim jetonları API'ye yapılan bir sonraki çağrıda otomatik olarak edinilir 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 istemci sırrı.
    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ının uygulamaya verilen erişimi iptal etmediği sürece, jeton sunucusu yeni bir erişim jetonu içeren 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"
    }

    Yayınlanacak yenileme jetonlarının sayısıyla ilgili sınırlamalar olduğunu unutmayın. Müşteri başına/kullanıcı kombinasyonu başına bir, tüm istemcilerde ise kullanıcı başına bir sınır vardır. Yenileme jetonlarını uzun süreli depolamada saklamalı ve geçerli oldukları sürece kullanmaya devam etmelisiniz. Uygulamanız çok fazla yenileme jetonu isterse bu sınırlara rastlayabilir. Bu durumda, daha eski yenileme jetonları çalışmaz.

    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 Üçüncü taraf sitelerin ve hesabınıza erişimi olan uygulamaların site ve 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.

    PHP

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

    $client->revokeToken();

    Python

    Jetonu programatik olarak iptal etmek için https://oauth2.googleapis.com/revoke parametresini jeton olarak içeren ve Content-Type başlığını ayarlayan bir istek gönderin:

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

    Ruby

    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)
    

    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ştirilmişse yanıtın durum kodu 200 olur. Hata koşulları için 400 durum kodu, hata koduyla birlikte döndürülür.

    Node.js

    Jetonu programatik olarak iptal etmek için /revoke uç noktasına bir HTTPS POST isteği gönderin:

    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 buna karşılık gelen bir yenileme jetonu varsa yenileme jetonu da iptal edilir.

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

    HTTP/REST

    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.