Bu dokümanda, web sunucusu uygulamalarının Google API'lerine erişmek üzere 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 sayesinde kullanıcılar bir uygulamayla kullanıcı verilerini, şifreleri ve diğer bilgileri gizli tutarken belirli verileri paylaşabilir. Ö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ışı özel olarak kullanıcı yetkilendirmesi içindir. Gizli bilgileri depolayabilecek ve durumunu koruyabilecek uygulamalar için tasarlanmıştır. Uygun şekilde yetkilendirilmiş bir web sunucusu uygulaması, kullanıcı uygulamayla etkileşime girdiğinde veya kullanıcı uygulamadan ayrıldıktan sonra API'ye erişebilir.
Web sunucusu uygulamaları, özellikle 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ını kullanır. Web sunucusu uygulamaları, kullanıcı yetkilendirmesiyle birlikte hizmet hesaplarını kullanabilir.
İstemci kitaplıkları
Bu sayfadaki dile özgü örnekler, OAuth 2.0 yetkilendirmesini uygulamak için Google API İstemci Kitaplıkları'nı kullanır. Kod örneklerini çalıştırmak için öncelikle kendi dilinizdeki istemci kitaplığını yüklemeniz gerekir.
Uygulamanızın OAuth 2.0 akışını işlemek için bir Google API İstemci Kitaplığı kullandığınızda, istemci kitaplığı uygulamanın normalde kendi başına yapması gereken birçok işlem gerçekleştirir. Örneğin, bu erişim izni, uygulamanın depolanan erişim jetonlarını ne zaman kullanabileceğini veya yenileyebileceğini ve iznin ne zaman tekrar alınması gerektiğini belirler. İstemci kitaplığı da doğru yönlendirme URL'leri oluşturur ve erişim jetonları için yetkilendirme kodları değiş tokuşu 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ştirin
Google API'lerini çağıran tüm uygulamaların, API Consoleiçinde bu API'leri etkinleştirmesi gerekir.
Projenizde API'yi etkinleştirmek için:
- Open the API Library içinde Google API Console.
- If prompted, select a project, or create a new one.
- API Library mevcut tüm API'leri ürün ailesine ve popülerliğe göre gruplandırılmış halde listeler. Etkinleştirmek istediğiniz API listede görünmüyorsa API'yi bulmak için arama özelliğini kullanın veya ait olduğu ürün ailesinde Tümünü Göster'i 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şturun
Google API'lerine erişmek için OAuth 2.0 kullanan tüm uygulamaların, uygulamayı Google'ın OAuth 2.0 sunucusuna tanımlayan yetkilendirme kimlik bilgilerine sahip olması gerekir. Aşağıdaki adımlarda projeniz için kimlik bilgilerinin nasıl oluşturulacağı açıklanmaktadır. Böylece uygulamalarınız bu proje için etkinleştirdiğiniz API'lere erişmek üzere kimlik bilgilerini kullanabilir.
- Go to the Credentials page.
- Kimlik bilgisi oluştur > OAuth istemci kimliği seçeneğini tıklayın.
- Web uygulaması uygulama türünü seçin.
- Formu doldurun ve Oluştur'u tıklayın. PHP, Java, Python, Yakut ve .NET gibi dil ve çerçeveler kullanan uygulamalar, yetkili yönlendirme URI'leri belirtmelidir. Yönlendirme URI'leri, OAuth 2.0 sunucusunun yanıt gönderebileceği uç noktalardır. Bu uç noktalar Google'ın doğrulama kurallarına uygun olmalıdır.
Test için
http://localhost:8080
gibi yerel makineye işaret eden URI'ler belirtebilirsiniz. Bunu göz önünde bulundurarak, bu dokümandaki tüm örneklerin yönlendirme URI'si olarakhttp://localhost:8080
kullandığını unutmayın.Uygulamanızın yetkilendirme kodlarını sayfadaki diğer kaynaklara açık olmaması 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 etmelerine olanak tanır. Bu nedenle, istenen kapsam sayısı ile kullanıcı rızası alma olasılığı arasında ters bir ilişki olabilir.
OAuth 2.0 yetkilendirmesini uygulamaya başlamadan önce, uygulamanızın erişmesi gereken izinlerin kapsamını belirlemenizi öneririz.
Uygulamanızın, bağlamsal olarak kullanıcı verilerine erişim isteğinde bulunduğu bir ek yetkilendirme işlemi üzerinden yetkilendirme kapsamlarına erişim isteğinde bulunmasını da öneririz. Bu en iyi uygulama, kullanıcıların uygulamanızın istediği erişime neden ihtiyaç duyduğunu daha kolay anlamasını sağlar.
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 örneklerinden herhangi birini çalıştırmak için bir Google Hesabı'na, internete ve web tarayıcısına ihtiyacınız olacaktır. API istemci kitaplıklarından birini kullanıyorsanız aşağıdaki dile özgü gereksinimleri de inceleyin.
PHP
Bu dokümanda PHP kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız vardır:
- Komut satırı arayüzü (KSA) ve JSON uzantısı yüklüyken PHP 5.6 veya daha sonraki bir sürüm.
- Oluşturucu bağımlı yönetimi 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 vardır:
- Python 2.6 veya üstü
- pip paket yönetimi aracı.
- Python için Google API'leri İstemci Kitaplığı:
pip install --upgrade google-api-python-client
- Kullanıcı yetkilendirme 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 Yakut kod örneklerini çalıştırmak için aşağıdakilere ihtiyacınız vardır:
- Yakut 2.2.2 veya üstü
-
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 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ğırabilmek için herhangi bir kitaplık yüklemeniz gerekmez.
OAuth 2.0 erişim jetonlarını edinme
Aşağıdaki adımlarda, uygulamanızın kullanıcı adına API isteğinde bulunmak için kullanıcının iznini almak amacıyla uygulamanızın Google'ın OAuth 2.0 sunucusuyla nasıl etkileşime geçtiği gösterilmektedir. Uygulamanızın, kullanıcı yetkilendirme gerektiren bir Google API isteği yürütebilmesi için önce bu izne sahip olması gerekir.
Aşağıdaki listede bu adımlar hızlıca özetlenmektedir:
- Uygulamanız ihtiyaç duyduğu izinleri belirliyor.
- Uygulamanız, kullanıcıyı Google'a, istenen izinlerin listesiyle birlikte yönlendirir.
- Uygulamanız için izin verilip verilmeyeceğini kullanıcı belirler.
- Uygulamanız kullanıcının neye karar verdiğini öğrenir.
- 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ğini oluşturmanız gerekir. Bu istek, uygulamanızı tanımlayan parametreler belirler ve kullanıcıdan uygulamanıza vermesi istenecek izinleri tanımlar.
- 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.
- Google OAuth 2.0 uç noktasını doğrudan ç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 özgü örnekler, bu parametreleri ayarlayan bir nesne yapılandırmak için istemci kitaplığı 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. (İlgili dosya hakkında daha fazla bilgi için yetkilendirme kimlik bilgisi oluşturma sayfasına bakın.) Nesne ayrıca, uygulamanızın erişim izni istediği kapsamları ve uygulamanızın OAuth uç noktasının URL'sini tanımlar. Bu kimlik, Google'ın OAuth 2.0 sunucusundan gelen yanıtı işler. Son olarak kod, isteğe bağlı access_type
ve include_granted_scopes
parametrelerini ayarlar.
Örneğin, şu kod bir kullanıcının Google Drive'ına salt okuma, çevrimdışı erişim isteğinde bulunur:
$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
İstekte aşağıdaki bilgiler belirtilir:
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 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önlendireceğini belirler. Değer, müşterinizin API Console
Credentials pageiçinde 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
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 listesi. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını belirtir. Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesine olanak tanırken kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol etmelerine olanak tanır. Bu yüzden, istenen kapsam sayısı ile kullanıcı rızası 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); Mümkün olduğunda uygulamanızın yetkilendirme kapsamlarına erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine erişim izni isteyerek, 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 yoksa 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 ile yetkilendirme sunucusunun yanıtı arasında durumu korumak için kullandığı dize değerini belirtir.
Kullanıcı, uygulamanızın erişim isteğine izin verdikten veya reddettikten sonra, sunucu, URL'nin sorgu bileşeninde ( 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. 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 isteğinde bulunmak için artımlı yetkilendirme kullanmasını sağlar. Bu parametrenin değerini Bu değeri PHP'de ayarlamak için $client->setIncludeGrantedScopes(true); |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını biliyorsa Google Kimlik Doğrulama Sunucusu'na bir ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için ipucundan yararlanı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 projenizin ilk erişim isteğinde bulunması istenir. Daha fazla bilgi için Yeniden izin isteme başlıklı makaleyi inceleyin. Bu değeri PHP'de ayarlamak için $client->setApprovalPrompt('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 bir Flow
nesnesi oluşturur. Bu nesne, yetkilendirme kimlik bilgileri oluşturduktan sonra indirdiğiniz client_secret.json dosyasındaki bilgileri kullanarak uygulamanızı tanımlar. Bu nesne ayrıca uygulamanızın erişim izni istediği kapsamları ve uygulamanızın OAuth uç noktasının URL'sini tanımlar. Google, OAuth 2.0 sunucusundan gelen yanıtı işler. Son olarak kod, isteğe bağlı access_type
ve include_granted_scopes
parametrelerini ayarlar.
Örneğin, şu kod bir kullanıcının Google Drive'ına salt okuma, çevrimdışı erişim isteğinde bulunur:
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')
İstekte aşağıdaki bilgiler belirtilir:
Parametreler | |||||||
---|---|---|---|---|---|---|---|
client_id |
Zorunlu
Uygulamanızın istemci kimliği. Bu değeri API Console Credentials pagebölümünde bulabilirsiniz. Python'da, istemci istemcisini client_secret.json dosyasından 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önlendireceğini belirler. Değer, müşterinizin API Console
Credentials pageiçinde 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
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ı belirtir. Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesine olanak tanırken kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol etmelerine olanak tanır. Bu yüzden, istenen kapsam sayısı ile kullanıcı rızası alma olasılığı arasında ters bir ilişki vardır. Python'da, kapsam listesini belirtmek amacıyla 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ına erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine erişim izni isteyerek, 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 yoksa 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 ile yetkilendirme sunucusunun yanıtı arasında durumu korumak için kullandığı dize değerini belirtir.
Kullanıcı, uygulamanızın erişim isteğine izin verdikten veya reddettikten sonra, sunucu, URL'nin sorgu bileşeninde ( 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. 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 isteğinde bulunmak 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') |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını biliyorsa Google Kimlik Doğrulama Sunucusu'na bir ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için ipucundan yararlanı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 projenizin ilk erişim isteğinde bulunması istenir. Daha fazla bilgi için Yeniden izin isteme başlıklı makaleyi inceleyin. 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 nesnesi yapılandırmak için oluşturduğunuz client_secrets.json dosyasını kullanın. İstemci nesnesini yapılandırırken uygulamanızın erişmesi gereken kapsamları ve OAuth 2.0 sunucusundan gelen yanıtı işleyecek uygulamanızın kimlik uç noktasının URL'sini belirtirsiniz.
Örneğin, şu kod bir kullanıcının Google Drive'ına salt okuma, çevrimdışı erişim isteğinde bulunur:
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 HTTP isteklerine erişim jetonları 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. Bir erişim jetonunu almak için kullanıcıdan izin istemek amacıyla kullanıcıyı bir 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, müşterinizin API Console
Credentials pageiçinde 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
|
||||||
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 |
||||||
scope |
Zorunlu
Uygulamanızın, kullanıcı adına erişebileceği kaynakları tanımlayan boşlukla sınırlandırılmış bir kapsam listesi. Bu değerler, Google'ın kullanıcıya gösterdiği izin ekranını belirtir. Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesine olanak tanırken kullanıcıların uygulamanıza verdikleri erişim miktarını kontrol etmelerine olanak tanır. Bu yüzden, istenen kapsam sayısı ile kullanıcı rızası alma olasılığı arasında ters bir ilişki vardır. Mümkün olduğunda uygulamanızın yetkilendirme kapsamlarına erişim isteğinde bulunmasını öneririz. Artımlı yetkilendirme üzerinden kullanıcı verilerine erişim izni isteyerek, 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 yoksa uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri |
||||||
state |
Önerilen
Uygulamanızın, yetkilendirme isteğiniz ile yetkilendirme sunucusunun yanıtı arasında durumu korumak için kullandığı dize değerini belirtir.
Kullanıcı, uygulamanızın erişim isteğine izin verdikten veya reddettikten sonra, sunucu, URL'nin sorgu bileşeninde ( 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. |
||||||
include_granted_scopes |
İsteğe bağlı
Uygulamaların bağlam içinde ek kapsamlara erişim isteğinde bulunmak için artımlı yetkilendirme kullanmasını sağlar. Bu parametrenin değerini |
||||||
login_hint |
İsteğe bağlı
Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını biliyorsa Google Kimlik Doğrulama Sunucusu'na bir ipucu vermek için bu parametreyi kullanabilir. Sunucu, oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçerek giriş akışını basitleştirmek için ipucundan yararlanı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 projenizin ilk erişim isteğinde bulunması istenir. Daha fazla bilgi için Yeniden izin isteme başlıklı makaleyi inceleyin. Olası değerler:
|
2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendirin
Kimlik doğrulama ve yetkilendirme sürecini 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ı verilerine erişmesi gerektiğinde gerçekleşir. Artımlı yetkilendirme söz konusu olduğunda bu adım, uygulamanızın henüz erişim izni olmayan ek kaynaklara erişmesi gerektiğinde de geçerlidir.
PHP
- Google'ın OAuth 2.0 sunucusundan erişim istemek için URL oluşturun:
$auth_url = $client->createAuthUrl();
- Kullanıcıyı
$auth_url
adresine yönlendirin:header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
Python
Bu ö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
- Google'ın OAuth 2.0 sunucusundan erişim istemek için URL oluşturun:
auth_uri = auth_client.authorization_uri.to_s
- 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önteminden 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ı 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 vermemeye karar verir. Google, bu aşamada uygulamanızın adını ve kullanıcının yetkilendirme kimlik bilgileriyle erişim izni istediği Google API hizmetlerini gösteren bir izin penceresi ve verilecek erişim kapsamlarının özetini gösterir. Ardından 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ın yapılıp yapılmadığını gösteren yanıt beklendiğinden, uygulamanızın bu aşamada herhangi bir işlem yapması gerekmez. Bu yanıt sonraki adımda açıklanmıştır.
Hatalar
Google'ın OAuth 2.0 yetkilendirme uç noktasına yapılan isteklerde, beklenen kimlik doğrulama ve yetkilendirme akışları yerine kullanıcıya yönelik hata mesajları gösterilebilir. Sık karşılaşılan 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. Bir yöneticinin OAuth istemci kimliğinize açıkça erişim izni verilene kadar, tüm kapsamlara veya hassas ve kısıtlanmış kapsamlara erişimi nasıl kısıtlayabileceği hakkında daha fazla bilgi edinmek için Google Workspace Yönetici yardım makalesine göz atın: Google Workspace verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme.
disallowed_useragent
Yetkilendirme uç noktası, Google'ın OAuth 2.0 Politikaları tarafından izin verilmeyen bir yerleşik kullanıcı aracısının içinde görüntülenir.
Android
Android geliştiricileri, android.webkit.WebView
ürününde yetkilendirme isteklerini açarken bu hata mesajıyla karşılaşabilir.
Geliştiriciler bunun yerine Android için Google ile Oturum Açma veya OpenID Foundation'ın Android için AppAuth gibi Android kitaplıklarını kullanmalıdır.
Bir Android uygulaması, yerleştirilmiş bir kullanıcı aracısında genel bir web bağlantısı açı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 varsayılan bağlantı işleyicisinde (Android App Links işleyicilerini veya varsayılan tarayıcı uygulamasını içeren) genel bağlantıların açılmasına izin vermelidir. Ayrıca, Android Özel Sekmeleri kitaplığı da desteklenen bir seçenektir.
iOS
iOS ve macOS geliştiricileri, WKWebView
'te yetkilendirme istekleri açarken bu hatayla karşılaşabilir.
Geliştiriciler bunun yerine iOS için Google ile Oturum Açma veya OpenID Foundation'ın iOS için AppAuth gibi iOS kitaplıklarını kullanmalıdır.
Bir iOS veya macOS uygulaması, yerleştirilmiş bir kullanıcı aracısında genel bir web bağlantısı açtığında ve kullanıcı, sitenizden Google'ın OAuth 2.0 yetkilendirme uç noktasına gittiğinde web geliştiricileri bu hatayla karşılaşabilir. Geliştiriciler, genel bağlantıların 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 sınırlayan bir projenin parçasıdır. Bu yapılandırma seçeneği hakkında daha fazla bilgi için OAuth kullanıcı rızası ekranını ayarlama yardım makalesindeki Kullanıcı türü bölümüne bakın.
invalid_client
OAuth istemci gizli anahtarı yanlış. Bu istek için kullanılan istemci kimliği ve gizli bilgi de dahil olmak üzere OAuth istemci yapılandırmasını inceleyin.
invalid_grant
Bir erişim jetonunu yenilerken veya ek yetkilendirme kullanılırken jetonun süresi dolmuş veya jeton geçersiz olabilir. Kullanıcının kimliğini yeniden doğrulayın ve yeni jetonlar almak için kullanıcıdan izin isteyin. Bu hatayı görmeye devam ediyorsanız uygulamanızın doğru yapılandırıldığından ve isteğinizde doğru jetonları ve parametreleri kullandığınızdan emin olun. Aksi takdirde, kullanıcı hesabı silinmiş veya devre dışı bırakılmış olabilir.
redirect_uri_mismatch
Yetkilendirme isteğinde iletilen redirect_uri
, OAuth istemci kimliği için yetkili bir 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ışını ifade edebilir. Entegrasyonunuzu güncellemek için taşıma rehberini inceleyin.
4. Adım: OAuth 2.0 sunucu yanıtını işleme
OAuth 2.0 sunucusu, istekte belirtilen URL'yi kullanarak uygulamanızın erişim isteğine yanıt verir.
Kullanıcı erişim isteğini onaylarsa yanıt, bir yetkilendirme kodu içerir. Kullanıcı isteği onaylamazsa yanıtta bir hata mesajı olur. 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önlendirilirsiniz. Bu durumda, yerel makineniz bu adreste bir dosya sunmadığı sürece muhtemelen 404 NOT FOUND
hatası verir. Bir sonraki adımda, kullanıcı uygulamanıza tekrar yönlendirildiğinde URI'da döndürülen bilgiler hakkında daha fazla ayrıntı sağlanmaktadır.
5. Adım: Yenileme ve erişim jetonları için yetkilendirme kodu değiş tokuşu yapın
Web sunucusu yetkilendirme kodunu aldıktan sonra, erişim kodu için yetkilendirme kodunu takas edebilir.
PHP
Bir erişim jetonuyla ilgili yetkilendirme kodu 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, söz konusu yanıttaki yetkilendirme kodunu bir erişim jetonuyla değiştirmek için flow.fetch_token
yöntemini kullanın:
state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'], state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store the credentials in the session. # ACTION ITEM for developers: # Store user's access and refresh tokens in your data store if # incorporating this code into your real app. credentials = flow.credentials flask.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes}
Ruby
Bir erişim jetonuyla ilgili yetkilendirme kodu değiştirmek için fetch_access_token!
yöntemini kullanın:
auth_client.code = auth_code auth_client.fetch_access_token!
Node.js
Bir erişim jetonuyla ilgili yetkilendirme kodu 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
Bir erişim jetonuyla ilgili 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 |
API Console Credentials pagekaynağından alınan istemci kimliği. |
client_secret |
API Console Credentials pageöğesinden alınan 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 API Console
Credentials page içinde projenizde 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, kısa ömürlü erişim jetonu ve yenileme jetonu içeren bir JSON nesnesi döndürerek bu isteğe yanıt verir.
Yenileme jetonunun yalnızca uygulamanız, Google'ın yetkilendirme sunucusuna gönderilen ilk istekte access_type
parametresini offline
değerine ayarladığı durumlarda döndürülür.
Yanıtta aşağıdaki alanlar bulunur:
Alanlar | |
---|---|
access_token |
Uygulamanızın bir Google API isteğini yetkilendirmek için gönderdiği jeton. |
expires_in |
Erişim jetonunun saniye cinsinden 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 Google'ın yetkilendirme sunucusuna yapılan ilk istekte access_type parametresini offline olarak ayarlarsanız bulunur.
|
scope |
access_token tarafından verilen erişim kapsamları, boşlukla ayrı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 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 jetonunun 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ının tekrar izin vermesini istemek için OAuth sürecini yeniden başlatarak yeni bir kod isteyin.
Google API'lerini çağırma
PHP
Aşağıdaki adımları tamamlayarak Google API'lerini çağırmak için erişim jetonunu kullanın:
- Bir erişim jetonunu yeni bir
Google\Client
nesnesine 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 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 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 bu jetonu kullanarak belirli bir kullanıcı hesabı veya hizmet hesabı adına API isteklerini yetkilendirebilir. çağırmak istediğiniz API için hizmet nesnesi oluşturmak üzere kullanıcıya özel yetkilendirme kimlik bilgilerini kullanın ve ardından söz konusu nesneyi yetkili API isteklerinde bulunmak için kullanın.
- çağırmak istediğiniz API için hizmet nesnesi oluşturun.
googleapiclient.discovery
kitaplığınınbuild
yöntemini, API'nin adı ve sürümüyle birlikte, kullanıcı kimlik bilgileriyle çağırarak 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)
- 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:
- çağırmak istediğiniz API için hizmet nesnesi oluşturun.
Örneğin, Drive API'nin 2. sürümünü çağırmak için:
drive = Google::Apis::DriveV2::DriveService.new
- Hizmetteki kimlik bilgilerini ayarlayın:
drive.authorization = auth_client
- 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, bir yönteme options
parametresi girilerek yönteme göre yetkilendirme 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. çağırmak istediğiniz API için 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 erişim jetonu aldıktan sonra, bu API'nin gerektirdiği erişim kapsamlarının verilmesi durumunda jetonu, belirli bir kullanıcı hesabı adına bir Google API'sine çağrı yapmak için kullanabilirsiniz. Bunu yapmak için access_token
sorgu parametresi veya Authorization
HTTP üst bilgisi Bearer
değeri ekleyerek API isteğine bir erişim jetonu ekleyin. Sorgu dizeleri sunucu günlüklerinde görüldüğü için, mümkün olduğunda HTTP üst bilgisi 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 Dosyalar API'si) 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
Kimliği doğrulanmış kullanıcı için access_token
sorgu dizesi parametresini kullanarak aynı API'ye yapılan bir çağrıyı burada görebilirsiniz:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
curl
örnekleri
Bu komutları curl
komut satırı uygulamasıyla test edebilirsiniz. HTTP üst bilgi 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 parametre seçeneği:
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 dosyaların JSON biçimli bir listesi yazdırılır ve uygulamanın kullanıcının Drive meta verilerine erişmesine izin verilir.
PHP
Bu örneği çalıştırmak için:
- API Consoleiçinde, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin,
http://localhost:8080
URL'sini ekleyin. - Yeni bir dizin oluşturun ve mevcut 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 sunmak üzere 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.csv
<?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)); }
OAuth2 geri çağırma.csv
<?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ö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. İstek 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 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 önceden verdiği 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ışırsa ne olacağını görebilirsiniz. Ayrıca, bir kullanıcının uygulamanıza verilen izinleri iptal etmesi ve uygulamanızın yine de iptal edilmiş erişim jetonuyla bir isteği yetkilendirmeye çalışması durumunda 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:
-
API Consoleiçinde, yerel makinenin URL'sini yönlendirme URL'leri listesine ekleyin. Örneğin,
http://localhost
URL'sini ekleyin. - LTS bakımı, etkin LTS veya Node.js'nin güncel sürümünün yüklü olduğundan emin olun.
-
Yeni bir dizin oluşturun ve mevcut 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
-
main.js
dosyalarını aşağıdaki içerikle oluşturun. -
Ö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ılı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'leriniz 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'ya ilişkin 3. bölüme 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'leri dahil) bu kuraldan muaftır. |
Düzenleyen |
Ana makineler ham IP adresi olamaz. Localhost IP adresleri bu kuraldan muaftır. |
Alan |
“googleusercontent.com” olamaz.goo.gl ) içeremez. Ayrıca, daha dar bir alan adına sahip bir uygulama bu alan adına yönlendirme yapmayı seçerse yönlendirme URI'sı, kendi yolunda “/google-callback/” ifadesini içermeli veya “/google-callback” ile bitmelidir. |
Kullanıcı bilgileri |
Yönlendirme URI'leri, userinfo alt bileşenini içeremez. |
Yol |
Yönlendirme URI'leri bir yol geçişi (dizin geri izlemesi olarak da bilinir) içeremez. Bu yollar, |
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ğıdakileri de içeren belirli karakterleri içeremez:
|
Ek yetkilendirme
OAuth 2.0 protokolünde, uygulamanız kapsamlar tarafından belirlenen kaynaklara erişim izni ister. İhtiyacınız olduğunda kaynaklar için yetkilendirme isteğinde bulunmak 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, kapsamları gereken şekilde istemenize imkan sağlar ve kullanıcı yeni kapsam için izin verirse kullanıcının projeye verdiği tüm kapsamları içeren bir jeton alınabilecek bir yetkilendirme kodu döndürür.
Örneğin, kullanıcıların müzik parçalarını örnekleyip mix oluşturmalarına olanak tanıyan bir uygulama, oturum açma sırasında çok az sayıda kaynağa ihtiyaç duyabilir. Bu kaynak, muhtemelen oturum açan kişinin adından başka hiçbir şey değildir. Ancak tamamlanmış bir mix'i kaydetmek için kullanıcının Google Drive'ına erişmesi gerekir. Çoğu kullanıcı, yalnızca uygulamanın gerçekten ihtiyaç duyduğu anda Google Drive'larına erişmelerinin istenmesi durumunda doğal bir çözüm tercih edecektir.
Bu durumda, oturum açma sırasında uygulama, temel oturum açma işleminin gerçekleştirilmesi için openid
ve profile
kapsamlarını, ardından da ilk karışımın kaydedilmesi için şu anda https://www.googleapis.com/auth/drive.file
kapsamı isteğinde bulunabilir.
Ek 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.
Ek bir yetkilendirmeden elde edilen erişim jetonu için aşağıdaki kurallar geçerlidir:
- Bu jeton, yeni ve birleştirilmiş yetkilendirmeye dahil edilen kapsamlardan herhangi birine karşılık gelen kaynaklara erişmek için kullanılabilir.
- Bir erişim jetonu almak için birleştirilmiş yetkilendirmeye ait yenileme jetonunu kullandığınızda, erişim jetonu
birleşik yetkilendirmeyi temsil eder ve yanıta dahil edilen
scope
değerlerinden herhangi biri için kullanılabilir. - Birleştirilmiş yetkilendirme, bu izin farklı istemcilerden istenmiş olsa bile kullanıcının, API projesine verdiği tüm kapsamları içerir. Örneğin, bir kullanıcı bir uygulamanın masaüstü istemcisini kullanarak bir kapsama erişim izni verdiyse ve ardından aynı istemciye bir mobil istemci üzerinden başka bir kapsam verirse iki yetkilendirme de her iki kapsamı 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 eşzamanlı olarak iptal edilir.
1. Adım: Yetkilendirme parametrelerini ayarlayın bölümündeki dile özel kod örnekleri ve 2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendirme alanındaki örnek HTTP/REST yönlendirme URL'si artımlı yetkilendirme kullanır. Aşağıdaki kod örnekleri, ek yetkilendirmeyi kullanmak için eklemeniz gereken kodu da göstermektedir.
PHP
$client->setIncludeGrantedScopes(true);
Python
Yetkilendirme isteğinin daha önce verilen kapsamları içerdiğinden emin olmak için Python'da 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 yenileme (çevrimdışı erişim)
Erişim jetonlarının süresi düzenli olarak dolar ve ilgili API isteği için geçersiz kimlik bilgisi haline gelir. Jetonla ilişkili kapsamlar için çevrimdışı erişim isteğinde bulunduysanız kullanıcıdan izin istemeden (kullanıcının mevcut olmadığı zamanlar da dahil) bir erişim jetonunu yenileyebilirsiniz.
- Bir 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 gerektiği gibi 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ş tokuşu yaptığınızda 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 bir Google API'sine 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ı olmadığında erişim jetonunu yenilemesi 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 taraflı (JavaScript) web uygulamalarında kullanılmaz.
PHP
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 API API'sini kullanıcı adına Google API'lerine erişmek için kullanmaya devam edebilirsiniz. İstemci nesnesi erişim jetonunu gerektiği gibi yeniler.
Python
Python'da, erişim izni için kullanıcıdan yeniden izin istemek zorunda kalmadan erişim jetonunu yenileyebildiğinizden emin olmak için access_type
anahtar kelime bağımsız değişkenini offline
olarak ayarlayın. Aşağıdaki örnekte gösterildiği gibi, access_type
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 kullanıcı çevrimdışıyken API API'sini kullanıcı adına Google API'lerine erişmek için kullanmaya devam edebilirsiniz. İstemci nesnesi erişim jetonunu gerektiği gibi 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 API API'sini kullanıcı adına Google API'lerine erişmek için kullanmaya devam edebilirsiniz. İstemci nesnesi erişim jetonunu gerektiği gibi 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 API API'sini kullanıcı adına Google API'lerine erişmek için 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 yenileme jetonu kullanır. Her zaman en yeni jetonları depoladığınızdan emin olmanın kolay bir yolu, jetonlar 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 önce uygulamanıza gerekli izinleri verdiyseniz uygulamayı yeni bir yenileme jetonu almak üzere 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 jetonuna sahip olduğunda, 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 Consolehesabından alınan istemci kimliği. |
client_secret |
API Consoleöğesinden alınan istemci gizli anahtarı. |
grant_type |
OAuth 2.0 spesifikasyonunda açıklandığı 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 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" }
Gönderilecek yenileme jetonu sayısı sınırlıdır. İstemci/kullanıcı kombinasyonu başına ve tüm istemcilerde kullanıcı başına bir adet sınır uygulanır. Yenileme jetonlarını uzun süreli depolamada saklamanız ve geçerli oldukları sürece kullanmaya devam etmeniz gerekir. Uygulamanız çok fazla yenileme jetonu istiyorsa bu sınırlarla karşılaşabilirsiniz. Bu durumda, eski yenileme jetonlarının çalışması durur.
Jetonları 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 destek dokümanına bakın.
Bir uygulamanın kendisine verilen erişimi programatik olarak iptal etmesi de mümkündür. Kullanıcının iptal etmesi, bir uygulamayı kaldırması veya uygulama için gereken API kaynaklarının önemli ölçüde değişmesi halinde programatik iptal işlemi önemlidir. Diğer bir deyişle, kaldırma işleminin bir parçası, daha önce uygulamaya verilen izinlerin kaldırılmasını sağlamak için bir API isteği içerebilir.
PHP
Jetonu programatik olarak iptal etmek için revokeToken()
numarasını arayın:
$client->revokeToken();
Python
Jetonu programatik olarak iptal etmek için jetonu jeton olarak içeren ve Content-Type
başlığını ayarlayan https://oauth2.googleapis.com/revoke
isteğinde bulunun:
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ılı bir şekilde işlenirse 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ılı bir şekilde işlenirse 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 programatik olarak iptal etmek için https://oauth2.googleapis.com/revoke
isteğinde bulunur ve jetonu bir 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ılı bir şekilde işlenirse yanıtın HTTP durum kodu
200
olur. Hata koşulları için 400
durum kodu, hata koduyla birlikte döndürülür.