Bu belgede, web sunucusu uygulamalarının Google API'lerine erişmek amacıyla OAuth 2.0 yetkilendirmesini uygulamak için 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 kullanıcıların belirli verileri bir uygulamayla paylaşmasına olanak tanır. Örneğin, bir uygulama, kullanıcılardan 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 verilerin durumunu koruyabilen uygulamalar için tasarlanmıştır. Doğru şekilde yetkilendirilmiş bir web sunucusu uygulaması, kullanıcı uygulamayla etkileşim halindeyken veya 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ı da 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 gerçekleştirmesi 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 erişim jetonlarıyla yetkilendirme kodu değiştiren 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ştirin
Google API'lerini çağıran uygulamaların, bu API'leri API Consoleiçinde etkinleştirmesi gerekir.
Projeniz için bir API'yi etkinleştirmek üzere:
- Open the API Library Google API Consoleiçinde gösteriliyor.
- If prompted, select a project, or create a new one.
- API Library sütununda, ü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 aramayı kullanın veya ait olduğu ürün ailesinde Tümünü Görüntüle'yi tıklayın.
- Etkinleştirmek istediğiniz API'yi seçip Etkinleştir düğmesini tıklayın.
- If prompted, enable billing.
- If prompted, read and accept the API's Terms of Service.
Yetkilendirme kimlik bilgileri oluştur
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 söz konusu proje için etkinleştirdiğiniz API'lere erişmek için kimlik bilgilerini kullanabilir.
- Go to the Credentials page.
- Kimlik bilgisi oluştur > OAuth istemci kimliği seçeneğini tıklayın.
- Web uygulaması uygulaması türünü seçin.
- 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 yerel makineye işaret eden URI'ler (ör.
http://localhost:8080
) belirtebilirsiniz. Unutmayın, bu belgedeki tüm örneklerde yönlendirme URI'si olarakhttp://localhost:8080
kullanıldığını lütfen 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 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ı da kontrol edebilmesini sağlar. Dolayısıyla, istenen kapsamların 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şim için izin alması gereken kapsamları belirlemenizi öneririz.
Uygulamanızın, artımlı yetkilendirme süreciyle yetkilendirme kapsamlarına erişim isteğinde bulunmasını da öneririz. Bu işlemde uygulamanız, bir bağlamda kullanıcı verilerine erişim isteğinde bulunur. Bu en iyi uygulama, kullanıcıların uygulamanızın neden istediği erişime ihtiyaç duyduğunu 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 belgedeki kod örneklerinden herhangi birini çalıştırmak için Google Hesabınız, internet erişiminiz ve web tarayıcısı olması gerekir. API istemci kitaplıklarından birini kullanıyorsanız aşağıdaki dile özgü şartlara da bakın.
2.999
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ü olan PHP 5.6 veya sonraki sürümler.
- Composer bağımlılık yönetimi aracı.
-
PHP için Google API'ları İ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
vegoogle-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ümanda Ruby kod örneklerini çalıştırmak için şunlara ihtiyacınız vardır:
- Ruby 2.6 veya sonraki sürümleri
-
Ruby için Google Yetkilendirme Kitaplığı:
gem install googleauth
-
Sinatra Ruby web uygulaması çerçevesi.
gem install sinatra
Node.js
Bu belgede Node.js kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız vardı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ğırmak için 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ştirme izni almak için 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:
- Uygulamanız gereken izinleri tanımlar.
- Uygulamanız, kullanıcıyı istenen izinlerin listesiyle birlikte Google'a yönlendirir.
- Uygulamanıza izin verilip verilmeyeceğine kullanıcı karar verir.
- Uygulamanız, kullanıcının neye karar verdiğini öğrenir.
- 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 parametreleri bu URL'de 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.
2.999
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. (Dosyayla ilgili daha fazla bilgi 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 kimlik doğrulama uç noktasının URL'sini de tanımlar. Bu uç nokta, yanıtı Google'ın OAuth 2.0 sunucusundan işler. 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" 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 $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
Bu değeri PHP'de ayarlamak için $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 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 verdikleri erişim miktarını da kontrol edebilmesini 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 $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 isteğinde bulunmasını ö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 anlaması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 Kullanıcı tarayıcıda yokken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri Bu değeri PHP'de ayarlamak için $client->setAccessType('offline'); |
||||||
state |
Önerilen
Uygulamanızın, yetkilendirme isteğiniz ve yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir.
Sunucu, kullanıcı uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra Bu parametreyi; kullanıcıyı uygulamanızda doğru kaynağa yönlendirmek, tek seferlik rastgele bir sayı göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. Bu değeri PHP'de ayarlamak için $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ını sağlar. Bu parametrenin değerini Bu değeri PHP'de ayarlamak için $client->setIncludeGrantedScopes(true); |
||||||
enable_granular_consent |
İsteğe bağlı
Varsayılan olarak |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için kullanabilir. Sunucu, bu ipucunu oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için kullanılır. Parametre değerini, kullanıcının Google kimliğiyle eşdeğer olan bir e-posta adresi veya Bu değeri PHP'de ayarlamak için $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 isteğinde bulunduğunda istenir. Daha fazla bilgi için Yeniden izin isteme sayfasına göz atın. Bu değeri PHP'de ayarlamak için $client->setPrompt('consent'); Olası değerler:
|
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 bilgilerini oluşturduktan sonra indirdiğiniz client_secret.json dosyasındaki bilgileri kullanarak uygulamanızı tanımlayan bir Flow
nesnesi oluşturur. Bu nesne ayrıca uygulamanızın erişim izni istediği kapsamları ve uygulamanızın kimlik doğrulama uç noktasının URL'sini de tanımlar. Bu uç nokta, yanıtı Google'ın OAuth 2.0 sunucusundan işler. 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 pageiçinde bulabilirsiniz. Python'da, bir client_secret.json dosyasından istemci kimliğini almak için 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
Bu değeri Python'da ayarlamak için 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ı bilgilendirir. 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ı da kontrol edebilmesini 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 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 isteğinde bulunmasını ö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 anlaması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 Kullanıcı tarayıcıda yokken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri Python'da, authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||
state |
Önerilen
Uygulamanızın, yetkilendirme isteğiniz ve yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir.
Sunucu, kullanıcı uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra Bu parametreyi; kullanıcıyı uygulamanızda doğru kaynağa yönlendirmek, tek seferlik rastgele bir sayı göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. Python'da, 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ını sağlar. Bu parametrenin değerini Python'da, authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||
enable_granular_consent |
İsteğe bağlı
Varsayılan olarak |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için kullanabilir. Sunucu, bu ipucunu oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için kullanılır. Parametre değerini, kullanıcının Google kimliğiyle eşdeğer olan bir e-posta adresi veya Python'da, 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 isteğinde bulunduğunda istenir. Daha fazla bilgi için Yeniden izin isteme sayfasına göz atın. Python'da, authorization_url, state = flow.authorization_url( access_type='offline', prompt='consent', include_granted_scopes='true') Olası değerler:
|
Ruby
Uygulamanızda bir 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 ayrıca uygulamanızın OAuth 2.0 sunucusundan gelen yanıtı işleyen kimlik doğrulama uç noktasının URL'sini belirtirsiniz.
Örneğin, bu kod bir 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 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
adresinde. Bu uç noktaya yalnızca HTTPS üzerinden erişilebilir. Düz HTTP bağlantıları reddedildi.
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
|
||||||
response_type |
Zorunlu
Google OAuth 2.0 uç noktasının yetkilendirme kodu döndürüp döndürmediğini belirler. Web sunucusu uygulamaları için parametre değerini |
||||||
scope |
Zorunlu
Uygulamanızın kullanıcı adına erişebileceği kaynakları tanımlayan boşlukla sınırlandırılmış 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 verdikleri erişim miktarını da kontrol edebilmesini 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 isteğinde bulunmasını ö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 anlaması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 Kullanıcı tarayıcıda yokken uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri |
||||||
state |
Önerilen
Uygulamanızın, yetkilendirme isteğiniz ve yetkilendirme sunucusunun yanıtı arasındaki durumu korumak için kullandığı tüm dize değerlerini belirtir.
Sunucu, kullanıcı uygulamanızın erişim isteğini kabul ettikten veya reddettikten sonra Bu parametreyi; kullanıcıyı uygulamanızda doğru kaynağa yönlendirmek, tek seferlik rastgele bir sayı göndermek ve siteler arası istek sahtekarlığını azaltmak gibi çeşitli amaçlar için kullanabilirsiniz. |
||||||
include_granted_scopes |
İsteğe bağlı
Uygulamaların, bağlam içinde ek kapsamlara erişim istemek için artımlı yetkilendirme kullanmasını sağlar. Bu parametrenin değerini |
||||||
enable_granular_consent |
İsteğe bağlı
Varsayılan olarak |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını bilirse bu parametreyi, Google Kimlik Doğrulama Sunucusu'na ipucu sağlamak için kullanabilir. Sunucu, bu ipucunu oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için kullanılır. Parametre değerini, kullanıcının Google kimliğiyle eşdeğer olan bir e-posta adresi veya |
||||||
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 isteğinde bulunduğunda istenir. Daha fazla bilgi için Yeniden izin isteme sayfasına göz atın. Olası değerler:
|
2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendirme
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 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 iznine sahip olmadığı ek kaynaklara ilk kez erişmesi gerektiğinde de gerçekleşir.
2.999
- Google'ın OAuth 2.0 sunucusundan erişim istemek için bir URL oluşturun:
$auth_url = $client->createAuthUrl();
- Kullanıcıyı
$auth_url
öğesine 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
- 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)
- Kullanıcıyı
auth_uri
adresine yönlendirin.
Node.js
-
Google'ın OAuth 2.0 sunucusundan erişim istemek için 1. adım
generateAuthUrl
yönteminde oluşturulanauthorizationUrl
URL'sini kullanın. -
Kullanıcıyı
authorizationUrl
adresine 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österir. Böylece kullanıcı, uygulamanızın istediği bir veya daha fazla kapsama erişim izni verebilir veya 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. OAuth istemci kimliğinize açıkça erişim izni verilene kadar yöneticinin tüm kapsamlara ya da 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ı ile 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 Vakfı'nın Android için AppAuth hizmeti 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, işletim sisteminin varsayılan bağlantı işleyicisinde genel bağlantıların açılmasına izin vermelidir. Bu işleyici hem Android App Links hem de varsayılan tarayıcı uygulamasını içerir. 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 Vakfı'nın iOS için AppAuth hizmeti 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 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 işleyici, hem Evrensel Bağlantılar
işleyicilerini hem de varsayılan tarayıcı uygulamasını içerir.
SFSafariViewController
kitaplığı da desteklenen bir seçenektir.
org_internal
İstekteki OAuth istemci kimliği, belirli bir Google Cloud kuruluşundaki Google Hesaplarına erişimi sınırlayan bir projenin parçasıdır. Bu yapılandırma seçeneği hakkında daha fazla bilgi için OAuth izin ekranınızı ayarlamayla ilgili yardım makalesinin Kullanıcı türü bölümüne bakı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 jetonu geçersiz hale gelmiş olabilir. Yeni jetonlar almak için kullanıcının kimliğini tekrar doğrulayın ve 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 rehberini inceleyin.
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 entegrasyonunuzun önerilen entegrasyon yöntemini kullandığını doğrulayın
4. Adım: OAuth 2.0 sunucu yanıtını işleyin
OAuth 2.0 sunucusu, uygulamanızın erişim isteğine istekte belirtilen URL'yi kullanarak yanıt verir.
Kullanıcı erişim isteğini onaylarsa yanıt bir 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ığı takdirde büyük olasılıkla 404 NOT FOUND
hatası verir. Bir sonraki adım, kullanıcı uygulamanıza tekrar yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha fazla ayrıntı sağlar.
5. Adım: Yenileme ve erişim jetonları için yetkilendirme kodunu değiştirin
Web sunucusu yetkilendirme kodunu aldıktan sonra, yetkilendirme kodunu bir erişim jetonuyla değiştirebilir.
2.999
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, flow.fetch_token
yöntemini kullanarak bu yanıttaki yetkilendirme kodunu bir erişim jetonuyla değiştirin:
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
başlangıçta yetkilendirme isteğinde bulunan URL'ye yeniden yönlendirmek için authorizer.handle_auth_callback_deferred
yöntemini kullanın. Bu işlem, sonuçları kullanıcı 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
Erişim jetonuyla yetkilendirme kodunu 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üzerinden API Console alınan istemci kimliği. |
client_secret |
Credentials pageöğesinden alınan API Console istemci gizli anahtarı. |
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 |
Belirtilen client_id için projeniz için API Console
Credentials 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ü 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ıysa döndürüleceğini 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 bulunur.
|
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
Bir erişim jetonu için yetkilendirme kodunu değiştirirken beklenen yanıt yerine aşağıdaki hatayla karşılaşabilirsiniz. Sık karşılaşılan 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
2.999
Aşağıdaki adımları tamamlayarak Google API'lerini çağırmak için erişim jetonunu kullanın:
- 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);
- Ç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);
- Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istekte bulunun.
Ö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 bu nesneyi yetkili API istekleri yapmak için kullanın.
- Ç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ınbuild
yöntemini çağırarak bir hizmet nesnesi oluşturursunuz: Örneğin, Drive API'nin 3. sürümünü çağırmak için:from googleapiclient.discovery import build drive = build('drive', 'v2', credentials=credentials)
- Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istekte bulunun.
Ö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, erişim jetonu aldıktan sonra belirli bir kullanıcı hesabı veya hizmet hesabı adına API istekleri yapmak için bu jetonu kullanabilir. Kullanıcıya özel yetkilendirme kimlik bilgilerini kullanarak çağırmak istediğiniz API için bir hizmet nesnesi oluşturun ve bu nesneyi yetkili API istekleri yapmak için kullanın.
- Ç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
- Hizmette kimlik bilgilerini ayarlayın:
drive.authorization = credentials
- Hizmet nesnesinin sağladığı arayüzü kullanarak API hizmetine istekte bulunun.
Ö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
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 bir 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 ekleyin. 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 (örneğin, Drive Files API'yi çağırırken) Google API'lerine yönelik çağrılarınızı ayarlamak için bir istemci kitaplığı kullanabilirsiniz.
OAuth 2.0 Playground'da tüm Google API'lerini deneyebilir ve kapsamlarını görüntüleyebilirsiniz.
HTTP GET örnekleri
Authorization: Bearer
HTTP üst bilgisini kullanarak
drive.files
uç noktasına (Drive Files API) yapılan 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 parametresini kullanan 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 aşağıda bulabilirsiniz (tercih edilen):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Alternatif olarak sorgu dizesi parametresi seçeneğinden de yararlanabilirsiniz:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Tam örnek
Aşağıdaki örnekte, kullanıcının kimliğini doğruladı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.
2.999
Bu örneği çalıştırmak için:
- API Consolepolitikasında, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin,
http://localhost:8080
URL'sini ekleyin. - Yeni bir dizin oluşturup bu dizini değiştirin. Örneğin:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- Composer'ı kullanarak PHP için Google API İstemci Kitaplığı'nı yükleyin:
composer require google/apiclient:^2.10
- Aşağıdaki içerikle
index.php
veoauth2callback.php
dosyalarını oluşturun. - Ö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
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ışını başlatır. Başarılı olursa sayfa API yanıtını görüntüler.
- Kimlik doğrulama akışını doğrudan test etme: Bu bağlantı, kullanıcıyı yetkilendirme akışı yoluyla göndermeye çalışan bir sayfaya yönlendirir. Uygulama, kullanıcı adına yetkili 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.
- Clear Flask oturumu kimlik bilgileri: Bu bağlantı, Flask oturumunda depolanan yetkilendirme kimlik bilgilerini temizler. Bu sayede, uygulamanıza daha önce 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 yine de çalıştığında uygulamanızın alacağı API yanıtını da görebilirsiniz.
# -*- 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_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:
-
API Consoleüzerinde yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin,
http://localhost
ekleyin. - Bakım LTS'sinin, etkin LTS'nin veya mevcut Node.js sürümünün yüklü olduğundan emin olun.
-
Yeni bir dizin oluşturup bu dizini değiştirin. Örneğin:
mkdir ~/nodejs-oauth2-example cd ~/nodejs-oauth2-example
-
Install the
Google API Client
Library
for Node.js using npm:
npm install googleapis
-
Aşağıdaki içeriklerle
main.js
dosyalarını oluşturun. -
Şu ö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ğinde, OAuth 2.0 web akışını göstermek için Flask çerçevesi ve Requests kitaplığı kullanılır. Bu akışta Python için Google API İstemci Kitaplığı'nı kullanmanızı öneririz. (Python sekmesindeki örnek istemci kitaplığını kullanı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üvende 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 uygun olmalı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'ları (localhost IP adresi URI'ları dahil) bu kuraldan muaftır. |
Düzenleyen |
Ana makineler ham IP adresi olamaz. Yerel ana makine IP adresleri bu kuraldan muaftır. |
Alan |
“googleusercontent.com” olamaz.goo.gl ) içeremez. Ayrıca, daha kısa alan adına sahip bir uygulama bu alan adına yönlendirme yapmayı seçerse bu yönlendirme URI'sinin yolunda “/google-callback/” içermesi veya “/google-callback” ile bitmesi gerekir. |
Kullanıcı Bilgileri |
Yönlendirme URI'leri userinfo alt bileşenini içeremez. |
Yol |
Yönlendirme URI'leri, |
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:
|
Ek yetkilendirme
OAuth 2.0 protokolünde, uygulamanız kapsamlarla tanımlanan kaynaklara erişim izni ister. Kaynaklar için ihtiyaç duyduğunuzda yetkilendirme istemek, en iyi kullanıcı deneyimi uygulaması olarak kabul edilir. Bu uygulamayı etkinleştirmek için Google'ın yetkilendirme sunucusu artımlı yetkilendirmeyi destekler. Bu özellik, gerektiğinde kapsamları 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ı deneyip mix'ler oluşturmasına olanak tanıyan bir uygulama, oturum açma sırasında çok az kaynağa ihtiyaç duyabilir ve oturum açan kişinin adından başka bir şeye ihtiyaç duyamayabilir. Ancak, tamamlanmış bir mix'i kaydetmek için kullanıcıların Google Drive'larına erişim gerekir. Çoğu kullanıcı, yalnızca uygulamanın gerçekten ihtiyaç duyduğu anda Google Drive'a erişmesi istenseydi bunu doğal bulurdu.
Bu durumda, oturum açma sırasında uygulama, temel oturum açma işlemi 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ı yetkilendirme uygulamak için erişim jetonu isteme normal akışını tamamlarsınız ancak yetkilendirme isteğinin daha önce verilmiş kapsamları içerdiğinden emin olun. Bu yaklaşım sayesinde uygulamanız birden fazla erişim jetonu yönetmek zorunda kalmaz.
Artımlı yetkilendirmeden alınan erişim jetonu için aşağıdaki kurallar 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şik yetkilendirmeyi temsil eder ve yanıta dahil edilen
scope
değerleri için kullanılabilir. - Birleşik yetkilendirme, farklı istemcilerden izinler 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şkilendirilmiş 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 adımındaki örnek HTTP/REST yönlendirme URL'sinin tümü artımlı yetkilendirme kullanır. Aşağıdaki kod örnekleri, artımlı yetkilendirmeyi kullanmak için eklemeniz gereken kodu da göstermektedir.
2.999
$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 include_granted_scopes
, 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 (çevrimdışı erişim) yenileme
Erişim jetonlarının süresi belirli aralıklarla 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ıyorsanız istemci nesnesi, söz konusu 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 parametresinioffline
olarak ayarlamanız gerekir. Bu durumda, bir erişim jetonu için yetkilendirme kodu 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ı yokken bir Google API'ye erişmesi gereken tüm uygulamalar için çevrimdışı erişim isteğinde bulunmak zorunludur. Örneğin, önceden belirlenen zamanlarda yedekleme hizmetleri gerçekleştiren veya işlemler yürüten bir uygulamanın, kullanıcı mevcut değilken 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.
2.999
Uygulamanızın bir Google API'sine ç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 onun 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. access_type
, aşağıdaki örnekte gösterildiği gibi ayarladığınız 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, kullanıcı çevrimdışıyken onun 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'sine ç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 onun 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'sine ç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 onun 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 geçerlilik süresi sona erer. Bu kitaplık, süresi dolmak üzereyse yeni bir erişim jetonu almak için otomatik olarak 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 ayarlamış olmanız gerekir. Uygulamanıza, yenileme jetonu almak için uygun kısıtlamaları ayarlamadan gerekli izinleri 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ı alınır ve bir sonraki API çağrısında otomatik olarak 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 Consoleöğesinden alınan istemci kimliği. |
client_secret |
API Consolecihazından 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 bir 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 jetonlarının sayısıyla ilgili 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 süreli 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. 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ını ziyaret ederek 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 belgesini inceleyin.
Ayrıca bir uygulama, kendisine verilen erişimi programlı olarak iptal edebilir. 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 programatik iptal önemlidir. Başka bir deyişle, kaldırma süreci kapsamında, uygulamaya daha önce verilmiş olan izinlerin kaldırıldığından emin olmak için bir API isteği gönderilebilir.
2.999
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
adresine jetonu parametre olarak içeren ve Content-Type
üst bilgisini 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
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, 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 başarıyla işleme alınırsa 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 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, 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 başarıyla işleme alınırsa 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 programlı olarak iptal etmek için https://oauth2.googleapis.com/revoke
adresine 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, 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 başarıyla işlenirse yanıtın HTTP durum kodu 200
olur. Hata koşullarında hata koduyla birlikte 400
HTTP durum kodu döndürülür.