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

Bu belgede, web sunucusu uygulamalarının Google API İstemci Kitaplıkları veya Google Erişim için OAuth 2.0 yetkilendirmesini uygulayacak OAuth 2.0 uç noktaları Google API'leri

OAuth 2.0, kullanıcıların belirli verileri bir uygulamayla paylaşmasına olanak tanırken kullanıcı adlarını, şifreleri ve diğer bilgileri gizli tutabilirsiniz. Örneğin, bir uygulama OAuth 2.0'ı kullanarak şuradan izin alabilir: kullanıcıların Google Drive'larında dosya depolamasına izin verir.

Bu OAuth 2.0 akışı, özel olarak kullanıcı yetkilendirmesi içindir. Uygulamalar için tasarlanmıştır gizli bilgileri depolayabilen ve durum kontrolü yapabilen bir sistemdir. Uygun şekilde yetkilendirilmiş bir web sunucusu Uygulama, kullanıcı uygulamayla etkileşimde bulunurken veya kullanıcı sonrasında bir API'ye erişebilir uygulamadan ayrıldı.

Web sunucusu uygulamaları sıklıkla ayrıca hizmet hesapları'nı (özellikle de erişim için Cloud API'lerini çağırırken) API isteklerini yetkilendirmek için proje temelli verileri kullanır. Web sunucusu uygulamaları hizmeti kullanabilir ve kullanıcı yetkilendirmesi ile bağlantılı şekilde hesaplanabilir.

İstemci kitaplıkları

Bu sayfadaki dile özgü örnekler, Uygulanacak Google API İstemci Kitaplıkları OAuth 2.0 yetkilendirmesi. Kod örneklerini çalıştırmak için önce istemci kitaplığını kullanabilirsiniz.

Uygulamanızın OAuth 2.0 akışını işlemek için bir Google API İstemci Kitaplığı kullandığınızda, istemci kitaplığının, uygulamanın normalde kendi başına yapması gereken birçok işlemi gerçekleştirir. Örneğin, yapılandırmanın yanı sıra uygulamanın depolanan erişim jetonlarını ne zaman kullanabileceğini veya yenileyeceğini belirler. Uygulamanın yeniden izin alması gerektiğinde. İstemci kitaplığı da doğru yönlendirme oluşturur URL'leri destekler ve erişim jetonları için yetkilendirme kodları değiş tokuşu yapan yönlendirme işleyicilerin uygulanmasına yardımcı olur.

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

ziyaret edin.

Ön koşullar

Projeniz için API'leri etkinleştirin

Google API'lerini çağıran herhangi bir uygulamanın, bu API'ları API Console

Projenizde bir API'yi etkinleştirmek için:

  1. Open the API Library Google API Console.
  2. If prompted, select a project, or create a new one.
  3. API Library , mevcut tüm API'leri ürüne göre gruplandırılmış olarak listeler. ve ne kadar popüler olduğunu öğreneceğiz. Etkinleştirmek istediğiniz API listede görünmüyorsa aramayı kullanarak öğesini bulabilir veya ait olduğu ürün ailesinde Tümünü Göster'i tıklayabilirsiniz.
  4. Etkinleştirmek istediğiniz API'yi seçin ve Etkinleştir düğmesini tıklayın.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Yetkilendirme kimlik bilgileri oluşturma

Google API'lerine erişmek için OAuth 2.0 kullanan tüm uygulamaların yetkilendirme kimlik bilgilerine sahip olması gerekir kimliği tanımlayabileceksiniz. Aşağıdaki adımlarda, projenizin kimlik bilgilerini oluşturmalarını sağlar. Böylece uygulamalarınız kimlik bilgilerini kullanarak API'lere erişebilir bilgileri görürsünüz.

  1. Go to the Credentials page.
  2. Kimlik bilgisi oluştur > OAuth istemci kimliği seçeneğini tıklayın.
  3. Web uygulaması uygulama türünü seçin.
  4. Formu doldurun ve Oluştur'u tıklayın. Dil ve çerçeve kullanan uygulamalar .PHP, Java, Python, Ruby ve .NET gibi .NET kodları, yetkili yönlendirme URI'lerini belirtmelidir. İlgili içeriği oluşturmak için kullanılan yönlendirme URI'leri, OAuth 2.0 sunucusunun yanıt gönderebileceği uç noktalardır. Bu uç noktaların Google'ın doğrulama kurallarına uygun olması gerekir.

    Test için, yerel makineye başvuruda bulunan URI'lar belirtebilirsiniz. Örneğin, http://localhost:8080 Bunu aklınızda bulundurarak bu dokümandaki örneklerde yönlendirme URI'si olarak http://localhost:8080 kullanılmaktadır.

    Uygulamanızın kimlik doğrulama uç noktalarını tasarlamanızı öneririz. diğer kaynaklara yetkilendirme kodlarını göstermediğinden emin olmak için sayfasını ziyaret edin.

Kimlik bilgilerinizi oluşturduktan sonra şuradan client_secret.json dosyasını indirin. API Console. Dosyayı yalnızca uygulamanızın hangi verilere erişebileceğini kontrol edin.

Erişim kapsamlarını tanımlama

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesini sağlarken aynı zamanda da Böylece kullanıcılar, uygulamanıza izin verdikleri erişim miktarını kontrol edebilir. Böylece, talep edilen kapsamların sayısı ile gerçekleşme olasılığı arasında ters bir ilişki Kullanıcı izni alma.

OAuth 2.0 yetkilendirmesini uygulamaya başlamadan önce kapsamları tanımlamanızı öneririz. uygulamanızın erişim izni olması gerekir.

Uygulamanızın, bir artımlı yetkilendirme süreci kapsamında Kullanıcı verilerine bağlam içinde erişmek ister. Bu en iyi uygulama, kullanıcıların uygulamanızın istediği erişime neden ihtiyaç duyduğunu öğrenin.

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

Dile özgü gereksinimler

Bu dokümandaki kod örneklerinden herhangi birini çalıştırmak için bir Google hesabına, İnternet ve web tarayıcısı. API istemci kitaplıklarından birini kullanıyorsanız şuraya da bakın: aşağıdaki dile özgü şartları inceleyin.

PHP

Bu dokümandaki PHP kod örneklerini çalıştırmak için gerekenler:

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

    composer require google/apiclient:^2.10

Python

Bu belgedeki Python kod örneklerini çalıştırmak için gerekenler:

  • 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
    .
  • google-auth, google-auth-oauthlib ve Kullanıcı yetkilendirmesi için google-auth-httplib2.
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • Flask Python web uygulaması çerçevesi.
    pip install --upgrade flask
  • requests HTTP kitaplığı.
    pip install --upgrade requests

Ruby

Bu belgedeki Ruby kod örneklerini çalıştırmak için gerekenler:

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

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

    gem install sinatra

Node.js

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

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

    npm install googleapis crypto express express-session

HTTP/REST

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

OAuth 2.0 erişim jetonları alma

Aşağıdaki adımlarda uygulamanızın, Google OAuth 2.0 sunucusuyla nasıl etkileşimde bulunduğunu Kullanıcı adına API isteği gerçekleştirmek için kullanıcının izni. Uygulamanızda bu özellik bulunmalıdır kullanıcı yetkilendirmesi gerektiren bir Google API isteğini yürütmeden önce izin vermesi gerekir.

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

  1. Uygulamanız gereken izinleri belirler.
  2. Uygulamanız, kullanıcıyı istenen izin verir.
  3. Uygulamanıza izin verip vermeyeceğinize kullanıcı karar verir.
  4. Uygulamanız, kullanıcının neye karar verdiğini öğrenir.
  5. Kullanıcı istenen izinleri verdiyse uygulamanız Kullanıcı adına API isteklerinde bulunma.

1. Adım: Yetkilendirme parametrelerini ayarlayın

İlk adımınız, yetkilendirme isteği oluşturmaktır. Bu istek, Uygulamanızı tanımlamak ve kullanıcıdan kullanıcıya vermesi istenen izinleri tanımlamak en iyi yoludur.

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

Aşağıdaki sekmeler, web sunucusu uygulamaları için desteklenen yetkilendirme parametrelerini tanımlar. İlgili içeriği oluşturmak için kullanılan dile özgü örnekler, bir istemci kitaplığının veya yetkilendirme kitaplığının bu parametreleri ayarlayan bir nesneyi yapılandırabilirsiniz.

PHP

Aşağıdaki kod snippet'i bir Google\Client() nesnesi oluşturur. Bu nesne parametrelerini belirtin.

Bu nesne client_secret.json dosyanızdaki bilgileri kullanarak bir uygulamadır. (Daha fazla bilgi için yetkilendirme kimlik bilgileri oluşturma bölümüne bakın) tıklayın.) Nesne, uygulamanızın izin istediği kapsamları da tanımlar ve uygulamanızın kimlik doğrulama uç noktasına giden URL'yi eklemeniz gerekir. Bu uç nokta, Google'ın OAuth 2.0 sunucusu. Son olarak, kod, isteğe bağlı access_type ve include_granted_scopes parametre

Örneğin, bu kod bir kullanıcının Google Drive:

$client = new Google\Client();

// Required, call the setAuthConfig function to load authorization credentials from
// client_secret.json file.
$client->setAuthConfig('client_secret.json');

// Required, to set the scope value, call the addScope function
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

// Required, call the setRedirectUri function to specify a valid redirect URI for the
// provided client_id
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');

// Recommended, 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');

// Recommended, call the setState function. Using a state value can increase your assurance that
// an incoming connection is the result of an authentication request.
$client->setState($sample_passthrough_value);

// Optional, if your application knows which user is trying to authenticate, it can use this
// parameter to provide a hint to the Google Authentication Server.
$client->setLoginHint('hint@example.com');

// Optional, call the setPrompt function to set "consent" will prompt the user for consent
$client->setPrompt('consent');

// Optional, call the setIncludeGrantedScopes function with true to enable incremental
// authorization
$client->setIncludeGrantedScopes(true);

Python

Aşağıdaki kod snippet'i google-auth-oauthlib.flow modülünü kullanarak belirtin.

Bu kod, şunu kullanarak uygulamanızı tanımlayan bir Flow nesnesi oluşturur: sonra indirdiğiniz client_secret.json dosyasındaki bilgiler yetkilendirme kimlik bilgileri oluşturma. Bu nesne, izin verdiği kapsamları ve uygulamanızın URL'sini auth uç noktası aracılığıyla gönderilir. Son olarak, isteğe bağlı access_type ve include_granted_scopes parametrelerini ayarlar.

Örneğin, bu kod bir kullanıcının Google Drive:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Required, call the from_client_secrets_file method to retrieve the client ID from a
# client_secret.json file. The client ID (from that file) and access scopes are required. (You can
# also use the from_client_config method, which passes the client configuration as it originally
# appeared in a client secrets file but doesn't access the file itself.)
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

# Required, 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(
    # Recommended, 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',
    # Optional, enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true',
    # Optional, if your application knows which user is trying to authenticate, it can use this
    # parameter to provide a hint to the Google Authentication Server.
    login_hint='hint@example.com',
    # Optional, set prompt to 'consent' will prompt the user for consent
    prompt='consent')

Ruby

bir uygulamadır. Bir istemci nesnesini yapılandırdığınızda, uygulamanızın ihtiyaç duyduğu kapsamları belirtirsiniz uygulamanızın kimlik doğrulama uç noktasının URL'si ile birlikte erişimi (bu URL, yanıtı işler) .

Örneğin, bu kod bir kullanıcının Google Drive:

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')

Uygulamanız, OAuth 2.0 işlemlerini gerçekleştirmek için istemci nesnesini kullanır. Örneğin, yetkilendirme isteği URL'lerini kullanma ve HTTP isteklerine erişim jetonları uygulama.

Node.js

Aşağıdaki kod snippet'i bir google.auth.OAuth2 nesnesi oluşturur. Bu nesne parametrelerini belirtin.

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

const {google} = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');

/**
 * 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 secure random state value.
const state = crypto.randomBytes(32).toString('hex');

// Store state in the session
req.session.state = state;

// 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,
  // Include the state parameter to reduce the risk of CSRF attacks.
  state: state
});

Önemli Not - refresh_token yalnızca ilk yetkilendirme. Diğer ayrıntılar burada bulabilirsiniz.

HTTP/REST

Google'ın OAuth 2.0 uç noktası https://accounts.google.com/o/oauth2/v2/auth adresindedir. Bu uç noktasına yalnızca HTTPS üzerinden erişilebilir. Düz HTTP bağlantıları reddediliyor.

Google yetkilendirme sunucusu, web için aşağıdaki sorgu dizesi parametrelerini destekler sunucu uygulamaları:

Parametreler
client_id Zorunlu

Uygulamanızın istemci kimliği. Bu değeri API Console. Credentials page.

redirect_uri Zorunlu

Kullanıcı şunu tamamladıktan sonra API sunucusunun kullanıcıyı nereye yönlendireceğini belirler: yetkilendirme akışı. Değer, İstemcinizin API Console. Credentials page. Bu değer Sağlanan client_id için yetkili yönlendirme URI'si redirect_uri_mismatch hata.

http veya https şeması, büyük/küçük harf ve sondaki eğik çizgiye dikkat edin ("/") tümüyle eşleşmelidir.

response_type Zorunlu

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

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

scope Zorunlu

CEVAP boşlukla ayrılmış uygulamanızın erişebileceği kaynakları tanımlayan temsil eder. Bu değerler, Google'ın belirtir.

Kapsamlar, uygulamanızın yalnızca ihtiyaç duyduğu kaynaklara erişim istemesini sağlar aynı zamanda kullanıcıların, uygulamanıza erişebilecekleri erişim miktarını kontrol etmelerine de bir uygulamadır. Dolayısıyla, talep edilen kapsamların sayısı arasında ters bir ilişki vardır ve kullanıcının izin alma olasılığı bulunur.

Uygulamanızın yetkilendirme kapsamlarına bağlam içinde erişim isteğinde bulunmasını öneririz kullanmanızı öneririz. Kullanıcı verilerine bağlam içinde erişim isteğinde bulunarak ek yetkilendirme gibi ek özelliklerden yararlanarak kullanıcıların uygulamanızın istediği erişime neden ihtiyaç duyduğunu iyi anlayabilirsiniz.

access_type Önerilen

Kullanıcı yokken uygulamanızın erişim jetonlarını yenileyip yenileyemeyeceğini belirtir kontrol edin. Geçerli parametre değerleri: online, varsayılan değerdir. değer ve offline.

Uygulamanızın erişim jetonlarını yenilemesi gerekiyorsa değeri offline olarak ayarlayın kullanıcı tarayıcıda değilken. Bu, erişimi yenileme yöntemidir . Bu değer, Google yetkilendirme sunucunuzdan bir yenileme jetonu ve erişim jetonu döndürecek şekilde uygulama, jetonlar için yetkilendirme kodu değişimi yapar.

state Önerilen

Uygulamanızın, yetkilendirme sunucusunun yanıtıyla birlikte çalışır. Sunucu,name=value (?) redirect_uri, uygulamanızın erişim isteği.

Bu parametreyi, kullanıcıyı web sitesine yönlendirmek gibi çeşitli amaçlar için kullanabilirsiniz. uygulamanızda doğru kaynağı kullanma, nonce gönderme ve siteler arası isteği azaltma Sahtekarlık. redirect_uri metriğiniz tahmin edilebildiğinden state kullanılarak değeri, gelen bir bağlantının bir bağlantı durumu ya da kötü amaçlı yazılım Kimlik doğrulama isteği. Rastgele bir dize oluşturursanız veya bir çerezin karmasını ya da durumunu yakalayan başka bir değerle yanıtı doğrulayarak Ayrıca istek ve yanıtın aynı tarayıcıdan kaynaklandığından emin olun. gibi saldırılara karşı koruma sağlayarak siteler arası istek sahtecilik. Bkz. Keşif Bağlantısı state jetonunun nasıl oluşturulacağı ve onaylanacağıyla ilgili örnek dokümanları inceleyin.

include_granted_scopes İsteğe bağlı

Uygulamaların ek erişim istemek için artımlı yetkilendirme kullanmasını sağlar irdeleyelim. Bu parametrenin değerini true olarak ayarlarsanız ve verilirse yeni erişim jetonu, yetkilendirme isteği kapsamındaki tüm kapsamları da Kullanıcı daha önce uygulamaya erişim izni verdi. Bkz. artımlı yetkilendirme bölümüne bakın.

login_hint İsteğe bağlı

Uygulamanız hangi kullanıcının kimlik doğrulaması yapmaya çalıştığını biliyorsa bu parametreyi kullanabilir Google Kimlik Doğrulama Sunucusu'na bir ipucu sağlamak için kullanılır. Sunucu, bu ipucunu oturum açma formundaki e-posta alanını önceden doldurarak veya uygun çoklu giriş oturumunu seçin.

Parametre değerini bir e-posta adresi veya sub tanımlayıcısına ayarlayın. kullanıcının Google Kimliğine eşdeğer olmalıdır.

prompt İsteğe bağlı

Kullanıcıya sunmak için kullanılan, boşlukla ayrılmış, büyük/küçük harfe duyarlı bir istem listesi. Şunu yapmazsanız: bu parametreyi belirtirseniz kullanıcıdan yalnızca projenizde ilk erişim izni ister. Bkz. Daha fazla bilgi için yeniden izin isteniyor.

Olası değerler:

none Herhangi bir kimlik doğrulama veya izin ekranı göstermeyin. Şunlarla belirtilmemelidir: değerlerdir.
consent Kullanıcıdan izin isteyin.
select_account Kullanıcıdan hesap seçmesini isteyin.

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

Kimlik doğrulama işlemini başlatması için kullanıcıyı Google'ın OAuth 2.0 sunucusuna yönlendirin ve izin verilir. Bu durum genellikle, uygulamanızın kullanıcı verileri. Artımlı yetkilendirme durumunda ise adımı, uygulamanızın ilk önce erişebildiği ek kaynaklara erişmesi gerektiğinde de gerçekleşir henüz erişim iznine sahip değil.

PHP

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

Python

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

return flask.redirect(authorization_url)

Ruby

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

Node.js

  1. 1. Adım'da oluşturulan authorizationUrl URL'sini kullanın Google'ın OAuth 2.0 sunucusundan erişim istemeyi sağlayan generateAuthUrl yöntemi.
  2. Kullanıcıyı authorizationUrl adresine yönlendirin.
    res.redirect(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 uygulamasına izin verilmesini öneririz. Yanıt, uygulamanıza geri gönderilir kullanarak bir URL oluşturun.

3. adım: Google, kullanıcıdan izin ister

Bu adımda kullanıcı, uygulamanıza istenen erişimi verip vermeyeceğini belirler. Burada aşamasında, Google, uygulamanızın adını ve Google API'sini gösteren bir izin penceresi ve hizmetlerin kullanılabilmesi için gereken izinleri . İlgili içeriği oluşturmak için kullanılan daha sonra kullanıcı, uygulamanız tarafından istenen bir veya daha fazla kapsama erişim izni verebilir ya da isteği reddetmelidir.

Başvurunuzun sizden yanıt almayı beklediği için bu aşamada herhangi bir işlem yapması gerekmez. Google'ın, herhangi bir erişim izni verilip verilmediğini gösteren OAuth 2.0 sunucusu. Bu yanıtın açıklaması adım adım anlatacağız.

Hatalar

Google'ın OAuth 2.0 yetkilendirme uç noktasına gönderilen istekler, kullanıcılara yönelik hata mesajları gösterebilir. ile başlar. Sık karşılaşılan hata kodları ve önerilenler aşağıda listelenmiştir.

admin_policy_enforced

Google Hesabı, şu politikaları nedeniyle istenen bir veya daha fazla kapsamı yetkilendiremedi: Google Workspace yöneticilerine ulaşın. Google Workspace Yöneticisi yardım makalesine göz atın Hangi üçüncü taraf ve üçüncü taraf Dahili uygulamaların Google Workspace verilerine erişmesi veya bir yöneticinin tüm kapsamlara ya da hassas ve gizli erişim OAuth istemci kimliğinize açıkça erişim verilene kadar kısıtlanan kapsamları kısıtlamayın.

disallowed_useragent

Yetkilendirme uç noktası, Google'ın OAuth 2.0 Politikaları.

Android

Android geliştiricileri, android.webkit.WebView. Geliştiriciler bunun yerine Android için Google ile Oturum Açma veya COPPA Vakfı'nın Android için AppAuth

Bir Android uygulaması genel bir web bağlantısını açtığında, web geliştiricileri bu hatayla karşılaşabilir. Bir kullanıcı Google'ın OAuth 2.0 yetkilendirme uç noktasına tıkladığında, sitenizi ziyaret edin. Geliştiriciler, genel bağlantıların her iki türü de içeren işletim sistemi Android Uygulama Bağlantıları işleyicileri veya varsayılan tarayıcı uygulamasını kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan Android Özel Sekmeleri desteklenen bir seçenektir.

iOS

iOS ve macOS geliştiricileri, şurada yetkilendirme isteklerini açarken bu hatayla karşılaşabilir: WKWebView. Geliştiriciler bunun yerine şunun gibi iOS kitaplıklarını kullanmalıdır: iOS için Google ile Oturum Açma veya COPPA Vakfı'nın iOS için AppAuth

Web geliştiricileri, iOS veya macOS uygulaması Google'ın OAuth 2.0 yetkilendirme uç noktasına giden bir kullanıcı otomatik olarak sitenizi ziyaret edin. Geliştiriciler, genel bağlantıların her iki türü de içeren işletim sistemi Geçiş Bağlantıları işleyicileri veya varsayılan tarayıcı uygulamasını kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan SFSafariViewController desteklenen bir seçenektir.

org_internal

İstekteki OAuth istemci kimliği, belirli Google Cloud Kuruluşu. Bu yapılandırma seçeneği hakkında daha fazla bilgi için Kullanıcı türü "OAuth izin ekranınızı ayarlama başlıklı yardım makalesini inceleyebilirsiniz.

invalid_client

OAuth istemci gizli anahtarı yanlış. Şu göz atın: OAuth istemcisi yapılandırma, bu istek için kullanılan istemci kimliği ve gizli anahtar bilgilerini içermelidir.

invalid_grant

Bir erişim jetonunu yenilerken veya ek yetkilendirmeden sonra, jetonun geçerliliği sona ermiş veya geçersiz kılındı. Kullanıcının kimliğini tekrar doğrulayın ve yeni jetonlar almak için kullanıcıdan izin isteyin. Devam ediyorsanız görmek için uygulamanızın doğru yapılandırıldığından ve kullanarak istekte bulunabilirsiniz. Aksi takdirde, kullanıcı hesabında silinmiş veya devre dışı bırakılmış olabilir.

redirect_uri_mismatch

Yetkilendirme isteğinde iletilen redirect_uri, yetkili bir kuruluşla eşleşmiyor OAuth istemci kimliğinin yönlendirme URI'si. Şuradaki yetkili yönlendirme URI'lerini inceleyin: Google API Console Credentials page

redirect_uri parametresi, desteği sonlandırıldı ve artık desteklenmiyor. Daha fazla bilgi için taşıma rehberi inceleyebilirsiniz.

invalid_request

Talebinizle ilgili bir sorun oluştu. Bunun birkaç nedeni olabilir:

  • İstek düzgün biçimlendirilmemiş
  • İstekte gerekli parametreler eksikti
  • İstek, Google'ın desteklemediği bir yetkilendirme yöntemi kullanıyor. OAuth'unuzu doğrulayın entegrasyonun önerilen bir entegrasyon yöntemi kullanması

4. Adım: OAuth 2.0 sunucu yanıtını yönetin

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

Kullanıcı erişim isteğini onaylarsa yanıt bir yetkilendirme kodu içerir. Eğer Kullanıcı isteği onaylamazsa yanıt hata mesajı içerir. İlgili içeriği oluşturmak için kullanılan web sunucusuna döndürülen hata mesajı veya yetkilendirme kodu dizesi aşağıda gösterildiği gibidir:

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ı

Aşağıdaki örnek URL'yi tıklayarak bu akışı test edebilirsiniz. URL'de Google Drive'ınızdaki dosyaların meta verilerini görüntülemek için salt okuma erişimi:

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. Bu da büyük olasılıkla Yerel makineniz söz konusu adreste bir dosya sunmazsa 404 NOT FOUND hatası oluşur. İlgili içeriği oluşturmak için kullanılan sonraki adım, kullanıcı işlemi gerçekleştirdiğinde URI'da döndürülen bilgilerle ilgili uygulamanıza yönlendirilir.

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

Web sunucusu yetkilendirme kodunu aldıktan sonra, yetkilendirme kodunu değiş tokuş edebilir. kullanabilirsiniz.

PHP

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

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

Erişim jetonunu getAccessToken yöntemiyle alabilirsiniz:

$access_token = $client->getAccessToken();

Python

Geri arama sayfanızda, yetkilendirmeyi doğrulamak için google-auth kitaplığını kullanın sunucu yanıtı olabilir. Ardından, yetkilendirme değişimi için flow.fetch_token yöntemini kullanın. kod yazmanızı öneririz:

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 sunucusunu doğrulamak için googleauth kitaplığını kullanın tıklayın. Şu öğeyi kaydetmek için authorizer.handle_auth_callback_deferred yöntemini kullanın: yetkilendirme koduna ve yetkilendirme isteğinde bulunan URL'ye geri yönlendirmeye olanak tanır. Bu 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 kullanın yöntem:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
app.get('/oauth2callback', async (req, res) => {
  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 if (q.state !== req.session.state) { //check state value
    console.log('State mismatch. Possible CSRF attack');
    res.end('State mismatch. Possible CSRF attack');
  } else { // Get access and refresh tokens (if access_type is offline)

    let { tokens } = await oauth2Client.getToken(q.code);
    oauth2Client.setCredentials(tokens);
});

HTTP/REST

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

Alanlar
client_id API Consolearacından alınan istemci kimliği Credentials page.
client_secret API Consoleöğesinden alınan istemci gizli anahtarı Credentials page.
code İlk istekten döndürülen yetkilendirme kodu.
grant_type OAuth 2.0'da tanımlandığı gibi spesifikasyonu, bu alanın değeri authorization_code olarak ayarlanmalıdır.
redirect_uri API Console. Verilen süre için Credentials page client_id.

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 içeren bir JSON nesnesi döndürerek yanıt verir. jetonu ve yenileme jetonu bulunur. Yenileme jetonunun yalnızca uygulamanız access_type Google'ınoffline Yetkilendirme sunucusu'dur.

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 saniye cinsinden kalan ömrü.
refresh_token Yeni bir erişim jetonu almak için kullanabileceğiniz jeton. Yenileme jetonları Kullanıcı erişimi iptal ederse. Bu alan yalnızca access_type parametresini Google'ın yetkilendirme sunucusuna yapılan ilk istekte offline olarak ayarlar.
scope access_token tarafından verilen erişim kapsamları, boşlukla ayrılmış, büyük/küçük harfe duyarlı dizeler içerir.
token_type Döndürülen jetonun türü. Şu anda bu alanın değeri her zaman Bearer

Aşağıdaki snippet örnek bir yanıt gösterir:

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

Hatalar

Yetkilendirme kodunu erişim jetonuyla değiştirirken aşağıdaki sorunlarla karşılaşabilirsiniz: (beklenen yanıt yerine) hatası oluşur. Yaygın hata kodları ve önerilen çözümler şunlardır: aşağıda listelenmiştir.

invalid_grant

Sağlanan yetkilendirme kodu geçersiz veya yanlış biçimde. Şu tarihe kadar yeni bir kod isteyin: kullanıcıdan izin istemek için OAuth sürecini yeniden başlatma tekrar.

Google API'lerini çağırma

PHP

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

  1. Yeni bir Google\Client nesnesine erişim jetonu uygulamanız gerekirse Örneğin, erişim jetonunu bir kullanıcı oturumunda depoladıysanız setAccessToken yöntemi:
    $client->setAccessToken($access_token);
  2. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Hizmet nesnesini derlemek için oluşturucuya yetkilendirilmiş bir Google\Client nesnesi sağlayarak telefon etmek istiyorsunuz. Örneğin, Drive API'yi çağırmak için:
    $drive = new Google\Service\Drive($client);
    .
  3. API hizmetine istekte bulunmak için hizmet nesnesi tarafından sağlanan arayüz. Örneğin, kimliği doğrulanmış kullanıcının Google Drive'ındaki dosyaları listelemek için:
    $files = $drive->files->listFiles(array())->getItems();
    .

Python

Bir erişim jetonu aldıktan sonra, uygulamanız bu jetonu kullanarak belirli bir kullanıcı hesabı veya hizmet hesabı adına bir ad verebilirsiniz. Kullanıcıya özel yetkilendirme kimlik bilgilerini kullan API için bir hizmet nesnesi oluşturun ve bu nesneyi kullanarak yetkilendirilmiş API istekleri.

  1. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Hizmet nesnesini derlemek için googleapiclient.discovery kitaplığının build yöntemi API'nin adı ve sürümü ile kullanıcı kimlik bilgileri: Ö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)
  2. API hizmetine istekte bulunmak için hizmet nesnesi tarafından sağlanan arayüz. Örneğin, kimliği doğrulanmış kullanıcının Google Drive'ındaki dosyaları listelemek için:
    files = drive.files().list().execute()
    .

Ruby

Bir erişim jetonu aldıktan sonra, uygulamanız bu jetonu kullanarak belirli bir kullanıcı hesabı veya hizmet hesabı adına bir ad verebilirsiniz. Kullanıcıya özel yetkilendirme kimlik bilgilerini kullan API için bir hizmet nesnesi oluşturun ve bu nesneyi kullanarak yetkilendirilmiş API istekleri.

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

Alternatif olarak, options parametresini yönteme eklemek için:

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

Node.js

Erişim jetonu alıp bunu OAuth2 nesnesine ayarladıktan sonra nesneyi kullanın API'yi çağırın. Uygulamanız, adına API isteklerini yetkilendirmek için bu jetonu kullanabilir belirli bir kullanıcı hesabı veya hizmet hesabı. Ç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, bu jetonu kullanarak bir Google Belirli bir kullanıcı adına API kullanıcı hesabı(API'nin gerektirdiği erişim kapsamları verildiyse) ile birlikte çalışır. Bunu yapmak için API'ye yapılan bir istekte, access_token sorgusu ekleyerek erişim jetonunu parametresi veya Authorization HTTP başlığı Bearer değeri olabilir. Mümkünse HTTP üstbilgisi tercih edilir, çünkü sorgu dizeleri sunucu günlüklerinde görünür olma eğilimindedir. Çoğu zaman Google API'lerine yapılan çağrılarınızı ayarlamak için bir istemci kitaplığı kullanabilirsiniz (örneğin, Drive Files API'yi çağırma).

Tüm Google API'lerini deneyebilir ve kapsamlarını şuradan görüntüleyebilirsiniz: OAuth 2.0 Playground (OAuth 2.0 Oyun Alanı).

HTTP GET örnekleri

Bir drive.files Authorization: Bearer HTTP kullanan uç nokta (Drive Files API) başlık aşağıdaki gibi görünebilir. Kendi erişim jetonunuzu belirtmeniz gerektiğini unutmayın:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Aşağıda, kimliği doğrulanmış kullanıcı için aynı API'ye access_token kullanılarak yapılan bir çağrı verilmiştir. sorgu dizesi parametresi:

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

curl örnek

Bu komutları curl komut satırı uygulamasıyla test edebilirsiniz. Bir HTTP üstbilgisi seçeneğini kullanan bir örnek (tercih edilen):

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

Alternatif olarak, sorgu dizesi parametre seçeneği şu şekildedir:

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

Tam örnek

Aşağıdaki örnekte, Kullanıcı kimliğini doğrular ve uygulamanın, kullanıcının Drive meta verilerine erişmesine izin verir.

PHP

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

  1. API Consoleiçinde, yerel makinenin URL'sini listesidir. Örneğin, http://localhost:8080 ekleyin.
  2. Yeni bir dizin oluşturun ve bu dizinde değişiklik yapın. Örnek:
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
    .
  3. Google API İstemcisini yükleyin Besteci ile PHP için kitaplık:
    composer require google/apiclient:^2.10
  4. İçeriği kullanarak index.php ve oauth2callback.php dosyalarını oluşturun bölümüne göz atın.
  5. Örneği, PHP'yi sunacak şekilde yapılandırılmış bir web sunucusuyla çalıştırın. PHP 5.6 veya daha yeni bir sürüm kullanıyorsanız PHP'nin yerleşik test web sunucusunu kullanabilir:
    php -S localhost:8080 ~/php-oauth2-example
    .

index.php

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

session_start();

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

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

oauth2callback.php

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

session_start();

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

if (! isset($_GET['code'])) {
  // Generate and set state value
  $state = bin2hex(random_bytes(16));
  $client->setState($state);
  $_SESSION['state'] = $state;

  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  // Check the state value
  if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) {
    die('State mismatch. Possible CSRF attack.');
  }
  $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. Google http://localhost:8080 adresinde, OAuth 2.0'ı test etmenize olanak tanıyan bir web uygulaması çalıştırır akışı sağlar. Bu URL'ye giderseniz dört bağlantı görürsünüz:

  • API isteğini test etme: Bu bağlantı, örnek bir API yürütmeye çalışan bir sayfaya işaret eder isteğinde bulunabilirsiniz. Gerekirse yetkilendirme akışını başlatır. Başarılı olursa sayfada API yanıtı.
  • Kimlik doğrulama akışını doğrudan test etme: Bu bağlantı, kullanıcıyı göndermeye çalışan bir sayfaya yönlendirir. yetkilendirme akışı aracılığıyla sağlayabilirsiniz. Uygulama aşağıdaki işlemler için izin istiyor: Kullanıcı adına yetkili API istekleri gönderme
  • Mevcut kimlik bilgilerini iptal et: Bu bağlantı, iptal eder.
  • Clear Flask oturumu kimlik bilgilerini: Bu bağlantı, halihazırda sahip olduğunuz yetkilendirme kimlik bilgilerini temizler. emin olun. Bu, daha önce sitenizi ziyaret etmiş bir kullanıcının yeni bir oturumda API isteği yürütmeye çalıştı. Ayrıca bir kullanıcı size verilen izinleri iptal etmişse uygulamanızın alacağı API yanıtını görürsünüz. bir isteği yetkilendirmeye çalışırken uygulamanız hâlâ iptal edilmiş erişim jetonuyla bir isteği yetkilendirmeye çalışıyor olabilir.
ziyaret edin.
# -*- 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:

  1. API Consolebölümüne yerel makinenizi ekleyin. Örneğin, http://localhost.
  2. Bakım LTS'si, etkin LTS kanalı veya mevcut sürümün yüklü olduğundan emin olun. Node.js yüklendi.
  3. Yeni bir dizin oluşturun ve bu dizinde değişiklik yapın. Örnek:
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
    .
  5. Aşağıdaki içeriklerle main.js dosyalarını oluşturun.
  6. Örneği çalıştırın:
    node .\main.js
    .

main.js

const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');

/**
 * 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'
];
/* 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 app = express();

  app.use(session({
    secret: 'your_secure_secret_key', // Replace with a strong secret
    resave: false,
    saveUninitialized: false,
  }));

  // Example on redirecting user to Google's OAuth 2.0 server.
  app.get('/', async (req, res) => {
    // Generate a secure random state value.
    const state = crypto.randomBytes(32).toString('hex');
    // Store state in the session
    req.session.state = state;

    // 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,
      // Include the state parameter to reduce the risk of CSRF attacks.
      state: state
    });

    res.redirect(authorizationUrl);
  });

  // Receive the callback from Google's OAuth 2.0 server.
  app.get('/oauth2callback', async (req, res) => {
    // 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 if (q.state !== req.session.state) { //check state value
      console.log('State mismatch. Possible CSRF attack');
      res.end('State mismatch. Possible CSRF attack');
    } 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
  app.get('/revoke', async (req, res) => {
    // 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();
  });


  const server = http.createServer(app);
  server.listen(80);
}
main().catch(console.error);

HTTP/REST

Bu Python örneğinde Flask çerçevesi kullanılmaktadır ve OAuth'u göstermek için İstekler kitaplığı 2.0 web akışı. Bu akışta Python için Google API İstemci Kitaplığı'nı kullanmanızı öneririz. ( örneğinin istemci kitaplığını kullanması gerekir.)

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:
    state = str(uuid.uuid4())
    flask.session['state'] = state
    auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
                '&client_id={}&redirect_uri={}&scope={}&state={}').format(CLIENT_ID, REDIRECT_URI,
                                                                          SCOPE, state)
    return flask.redirect(auth_uri)
  else:
    if 'state' not in flask.request.args or flask.request.args['state'] != flask.session['state']:
      return 'State mismatch. Possible CSRF attack.', 400

    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ştiricilere yardımcı olmak amacıyla URI'leri yönlendirmek için aşağıdaki doğrulama kurallarını uygular sağlamak için çok iyi bir fırsattır. Yönlendirme URI'leriniz bu kurallara uygun olmalıdır. Görüntüleyin Şu URL'nin RFC 3986 bölüm 3: alan, ana makine, yol, sorgu, şema ve kullanıcıbilgisi tanımı, aşağıda açıklanmıştır.

Doğrulama kuralları
Şema

Yönlendirme URI'leri düz HTTP değil, HTTPS şemasını kullanmalıdır. Yerel ana makine URI'leri ( localhost IP adresi URI'leri) bu kuraldan muaftır.

Düzenleyen

Ana makineler ham IP adresleri olamaz. Localhost IP adresleri bu kuraldan muaftır.

Alan
  • Ana makine TLD'leri (Üst Düzey Alanlar) genel son ek listesine ait olmalıdır.
  • Ana makine alan adları “googleusercontent.com” olamaz.
  • Yönlendirme URI'leri aşağıdaki durumlar dışında URL kısaltıcı alan adları (ör. goo.gl) içeremez Uygulama, alanın sahibi. Ayrıca, daha kısa bir alan adına sahip bir uygulama söz konusu alana yönlendirme yapıyorsa bu yönlendirme URI'sinde “/google-callback/” yolunda veya şununla biter: “/google-callback”.
  • Kullanıcı Bilgileri

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

    Yol

    Yönlendirme URI'leri yol geçişi (dizin geri izleme olarak da adlandırılır) içeremez. (“/..”, “\..” veya bunların URL'si ile gösterilir) kullanır.

    Sorgu

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

    Parça

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

    Karakterler Yönlendirme URI'leri aşağıdakiler de dahil olmak üzere belirli karakterleri içeremez:
    • Joker karakterler ('*')
    • Yazdırılamayan ASCII karakterler
    • Yüzde kodlamaları geçersiz (URL kodlamasını izlemeyen herhangi bir yüzde kodlaması) ardından iki on altılı sayı içeren yüzde işareti biçiminde)
    • Boş karakterler (kodlanmış NULL karakteri, ör. %00, %C0%80)

    Artımlı yetkilendirme

    OAuth 2.0 protokolünde, uygulamanız kaynaklara erişim için yetkilendirme ister. kapsamlarla belirlenir. Yetkilendirme isteğinde bulunmak en iyi kullanıcı deneyimi uygulaması olarak kabul edilir. ihtiyaç duyduğunuz anda bulmanız gerekir. Bu uygulamayı etkinleştirmek için Google'ın yetkilendirme sunucusu, artımlı yetkilendirmeyi destekler. Bu özellik, gerektiğinde kapsamları istemenize olanak sağlar. kullanıcı yeni kapsam için izin verirse gerekebilecek bir yetkilendirme kodu kullanıcının projeye verdiği tüm kapsamları içeren bir jetonla takas edildi.

    Örneğin, kullanıcıların müzik parçalarından kesitler alıp mix oluşturmalarına olanak tanıyan bir uygulama için kaynaklarda oturum açan kişinin adı olabilir. Ancak, Tamamlanan bir mix'i kaydetmek, kullanıcının Google Drive'ına erişmeyi gerektirir. Çoğu kişi bunu bulur uygulama aslında yalnızca o sırada Google Drive'larına erişmeleri istense bile doğal olarak ihtiyaç duydu.

    Bu durumda, oturum açma sırasında uygulama openid ve profile kapsamlarını dahil edin ve daha sonra İlk istek sırasında https://www.googleapis.com/auth/drive.file kapsamı mix'i de kullanabilirsiniz.

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

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

    • Bu jeton, yeni ve birleştirilmiş yetkilendirmeyi kullanabilirsiniz.
    • Erişim jetonu almak amacıyla birleştirilmiş yetkilendirme için yenileme jetonunu kullandığınızda erişim jetonu, birleştirilmiş yetkilendirmeyi temsil eder ve Yanıta scope değer dahil edildi.
    • Birleştirilmiş yetkilendirme, kullanıcının API projesine verdiği tüm kapsamları ve ve bu bilgilerin farklı istemcilerden talep edilip edilmediğini kontrol edebilirsiniz. Örneğin, bir kullanıcı uygulamanın masaüstü istemcisini kullanarak bir kapsam ve ardından aynı kullanıcıya başka bir kapsam verildi uygulanması durumunda, birleştirilmiş yetkilendirme her iki kapsamı da kapsar.
    • Birleşik bir yetkilendirmeyi temsil eden bir jetonu iptal ederseniz tüm bunlara erişim ilişkilendirilmiş kullanıcı adına yetkilendirmenin kapsamları eşzamanlı olarak iptal edilir.
    ziyaret edin.

    1. Adım: Yetkilendirmeyi ayarlayın. parametrelerini ve 2. Adım: Google'ın OAuth 2.0 sunucusuna yönlendiren tüm yönlendirmeler artımlı yetkilendirme kullanır. Kod örnekleri aşağıda, artımlı yetkilendirme kullanmak için eklemeniz gereken kod da gösterilmektedir.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    Python'da, include_granted_scopes anahtar kelime bağımsız değişkenini true olarak ayarlayın Bir yetkilendirme isteğinin önceden verilmiş kapsamları içerdiğinden emin olun. Bir iş görüşmesinde include_granted_scopes, ayarladığınız tek anahtar kelime bağımsız değişkeni olmayacaktır. aşağıdaki örnekte gösterilmiştir.

    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 belirli aralıklarla sona erer ve ilgili API isteği için geçersiz kimlik bilgileri haline gelir. Siz Kullanıcı izin istemeden erişim jetonunu yenileyebilir (kullanıcının mevcut değil) girmeniz gerekir.

    Google'a erişmesi gereken uygulamalar için çevrimdışı erişim isteğinde bulunmak Kullanıcı olmadığında API. Örneğin, yedekleme hizmetleri gerçekleştiren veya yenilenmesi gerektiğinde erişim jetonunu yenileyebilmek için önceden belirlenmiş zamanlarda kullanıcı mevcut değil. Varsayılan erişim stili online olarak adlandırılır.

    Sunucu tarafı web uygulamaları, yüklü uygulamalar ve cihazların tümü yenileme jetonları alır sırasında açıklığa kavuşturulabilir. Yenileme jetonları genellikle istemci tarafında kullanılmaz. (JavaScript) web uygulamaları için geçerlidir.

    PHP

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

    $client->setAccessType("offline");

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra API'yi kullanmaya devam edebilirsiniz. İstemcinin, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmesini sağlayın. İstemci nesnesi erişim jetonunu gerektiği şekilde yeniler.

    Python

    Python'da, access_type anahtar kelime bağımsız değişkenini offline olarak ayarlayıp kullanıcıdan tekrar izin istemek zorunda kalmadan erişim jetonunu yenileyebileceğinize izni gerekir. access_type anahtar kelimesi tek anahtar kelime olmayabilir bağımsız değişkeni, aşağıdaki örnekte gösterildiği gibi, .

    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 API'yi kullanmaya devam edebilirsiniz. İstemcinin, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmesini sağlayın. İstemci nesnesi erişim jetonunu gerektiği şekilde yeniler.

    Ruby

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

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

    Bir kullanıcı istenen kapsamlara çevrimdışı erişim izni verdikten sonra API'yi kullanmaya devam edebilirsiniz. İstemcinin, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmesini sağlayın. İstemci nesnesi erişim jetonunu gerektiği şekilde yeniler.

    Node.js

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

    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 API'yi kullanmaya devam edebilirsiniz. İstemcinin, kullanıcı çevrimdışıyken kullanıcı adına Google API'lerine erişmesini sağlayın. İstemci nesnesi erişim jetonunu gerektiği şekilde yeniler.

    Erişim jetonlarının süresi dolar. Bu kitaplık, yeni bir erişim elde etmek için otomatik olarak yenileme jetonu kullanacak jetonu kullanma şansınız yoktur. En yeni jetonları her zaman saklamanı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 generateAuthUrl çağrılırken access_type - offline yöntemini kullanın. Uygulamanıza gerekli izinleri zaten verdiyseniz bir yenileme jetonu almak için uygun kısıtlamaları ayarlamadan yeni bir yenileme jetonu almak için uygulamayı yeniden yetkilendirin.

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

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

    İstemci bir yenileme jetonu aldıktan sonra, erişim jetonları alınır ve otomatik olarak yenilenir API'ye yapılan bir sonraki çağrıda belirtilir.

    HTTP/REST

    Uygulamanız, erişim jetonunu yenilemek için HTTPS POST gönderir yetkilendirme sunucusuna (https://oauth2.googleapis.com/token) gönderdiğiniz istek üzerine aşağıdaki parametreleri içerir:

    Alanlar
    client_id API Consoleöğesinden alınan istemci kimliği.
    client_secret API Consoleöğesinden alınan istemci gizli anahtarı.
    grant_type Farklı OAuth 2.0 spesifikasyonu, bu alanın değeri refresh_token olarak ayarlanmalıdır.
    refresh_token Yetkilendirme kodu exchange'inden 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 bir örnek yanıt:

    {
      "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ının sınırlı olduğunu unutmayın; başına bir sınır ve tüm istemcilerde her kullanıcı için ayrı ayrı düzenleyebilirsiniz. Yenileme jetonlarını kaydetmeniz gerekir uzun süreli depolama alanına sahip olacak ve geçerli kaldıkları sürece bunları kullanmaya devam edebileceksiniz. Uygulamanız çok fazla yenileme jetonu istiyorsa bu sınırlarla karşılaşabilir. Böyle bir durumda eski yenileme jetonları çalışmayı durduracak.

    Jetonu iptal etme

    Bazı durumlarda, bir kullanıcı bir uygulamaya verilen erişimi iptal etmek isteyebilir. Kullanıcı erişimi iptal edebilir adresini ziyaret ederek Hesap Ayarları. Bkz. Kaldır Üçüncü taraf sitelerin site veya uygulama erişimi bölümü ve hesabınıza erişimi olan uygulamalar destek dokümanına bakın.

    Bir uygulamanın, kendisine verilen erişimi programlı olarak iptal etmesi de mümkündür. Programlı iptal etme, bir kullanıcının e-posta listesinden çıktığı, bir veya sonraki bir veya bir uygulamanın gerektirdiği API kaynakları önemli ölçüde değişmiştir. Başka bir deyişle, Kaldırma sürecinin bir bölümü, izinleri önceden sağlamak için bir API isteği içerebilir. kaldırılır.

    PHP

    Bir jetonu programlı olarak iptal etmek için revokeToken() komutunu çağırın:

    $client->revokeToken();

    Python

    Bir jetonu programlı bir şekilde iptal etmek için https://oauth2.googleapis.com/revoke etiketi, jetonu parametre olarak içerir ve Content-Type üstbilgisi:

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

    Ruby

    Bir jetonu programlı bir şekilde iptal etmek için oauth2.revoke öğesine bir HTTP isteği gönderin uç nokta:

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

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

    İptal işlemi başarıyla tamamlanırsa yanıtın durum kodu 200 Hata koşulları için 400 durum kodu, yanında bir hata kodu.

    Node.js

    Bir jetonu programlı bir şekilde iptal etmek için /revoke adresine HTTPS POST isteği gönderin uç nokta:

    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 yenileme jetonu varsa yenileme jetonu da iptal edilir.

    İptal işlemi başarıyla tamamlanırsa yanıtın durum kodu 200 Hata koşulları için 400 durum kodu, yanında bir hata kodu.

    HTTP/REST

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

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

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

    İptal işlemi başarıyla tamamlanırsa yanıtın HTTP durum kodu 200 Hata koşulları için 400 ile birlikte HTTP durum kodu döndürülür hata kodu içerir.

    Hesaplar Arası Korumayı Uygulama

    Kullanıcılarınızın güvenliğini korumak için atmanız gereken ek bir adım Hesaplar Arası Google'ın Hesaplar Arası Koruma Hizmeti'ni kullanarak koruma. Bu hizmet sayesinde şunları yapabilirsiniz: uygulamanıza aşağıdaki konularda bilgi sağlayan güvenlik işlemi bildirimlerine abone olun: kullanıcı hesabında önemli değişiklikler yapabilir. Daha sonra bu bilgileri kullanarak karar verdiğinizden emin olun.

    Google'ın Hesaplar Arası Koruma Hizmeti tarafından uygulamanıza gönderilen etkinlik türlerine örnek olarak aşağıdakiler verilebilir:

    • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
    • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
    • https://schemas.openid.net/secevent/risc/event-type/account-disabled

    Bkz. Kullanıcı hesaplarını Hesaplar Arası Koruma ile koruma 'nı inceleyin. inceleyin.