Using OAuth 2.0 for Server to Server Applications (Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma)

Daha fazla bilgi için Google Cloud Platform belgelerindeki Kimlik Doğrulamaya Genel Bakış bölümünü inceleyin.

Google OAuth 2.0 sistemi, bir web uygulaması ile Google hizmeti arasındaki etkileşimler gibi sunucudan sunucuya etkileşimleri destekler. Bu senaryoda hizmet hesabı gerekir. Bu hesap, bireysel son kullanıcı yerine uygulamanıza ait bir hesaptır. Uygulamanız, hizmet hesabı adına Google API'lerini çağırdığından kullanıcılar doğrudan dahil olmaz. Bu senaryoya bazen "iki aşamalı OAuth" veya "2LO" da denir. (İlgili "üç aşamalı OAuth" terimi, uygulamanızın son kullanıcılar adına Google API'lerini çağırdığı ve bazen kullanıcı izninin gerekli olduğu senaryoları ifade eder.)

Genellikle uygulama, bir kullanıcının verileri yerine kendi verileriyle çalışmak için Google API'lerini kullandığında bir hizmet hesabı kullanır. Örneğin, veri kalıcılığı için Google Cloud Datastore'u kullanan bir uygulama, Google Cloud Datastore API'ye yaptığı çağrıların kimliğini doğrulamak üzere bir hizmet hesabı kullanır.

Google Workspace alan yöneticileri, alandaki hizmet kullanıcıları adına kullanıcı verilerine erişmesi için alan adı genelindeki hizmet hesaplarına da yetki verebilir.

Bu dokümanda, uygulamanın, Google API'leri istemci kitaplığı (önerilen) veya HTTP kullanarak sunucudan sunucuya OAuth 2.0 akışını nasıl tamamlayabileceği açıklanmaktadır.

Genel bakış

Sunucudan sunucuya etkileşimleri desteklemek için önce içinde projeniz için bir hizmet hesabı oluşturun. Google Workspace hesabınızdaki kullanıcıların kullanıcı verilerine erişmek istiyorsanız hizmet hesabına alan genelinde erişim yetkisi verin.

Ardından uygulamanız, OAuth 2.0 kimlik doğrulama sunucusundan bir erişim jetonu istemek için hizmet hesabının kimlik bilgilerini kullanarak yetkili API çağrıları yapmaya hazırlanır.

Son olarak, uygulamanız Google API'lerini çağırmak için erişim jetonunu kullanabilir.

Hizmet hesabı oluşturma

Hizmet hesabının kimlik bilgileri, benzersiz bir e-posta adresi ve en az bir ortak/özel anahtar çifti içerir. Alan genelinde yetki etkinse bir istemci kimliği, hizmet hesabı kimlik bilgilerinin bir parçası da olur.

Uygulamanız Google App Engine'de çalışıyorsa projenizi oluşturduğunuzda otomatik olarak bir hizmet hesabı oluşturulur.

Uygulamanız Google Compute Engine'de çalışıyorsa projenizi oluştururken otomatik olarak bir hizmet hesabı da oluşturulur. Ancak, bir Google Compute Engine örneği oluştururken uygulamanızın erişmesi gereken kapsamları belirtmeniz gerekir. Daha fazla bilgi için Hizmet hesaplarını kullanmak üzere bir örneği hazırlama bölümüne bakın.

Uygulamanız Google App Engine veya Google Compute Engine'de çalıştırılmıyorsa bu kimlik bilgilerini sayfasından almanız gerekir. Hizmet hesabı kimlik bilgileri oluşturmak veya daha önce oluşturduğunuz herkese açık kimlik bilgilerini görüntülemek için aşağıdakileri yapın:

First, create a service account:

  1. Open the Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Click  Create service account.
  4. Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
  5. Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
  6. Click Continue.
  7. Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
  8. Click Done.

Next, create a service account key:

  1. Click the email address for the service account you created.
  2. Click the Keys tab.
  3. In the Add key drop-down list, select Create new key.
  4. Click Create.

Your new public/private key pair is generated and downloaded to your machine; it serves as the only copy of the private key. You are responsible for storing it securely. If you lose this key pair, you will need to generate a new one.

E-posta adresini, ortak anahtar parmak izlerini ve diğer bilgileri görüntülemek veya ek ortak/özel anahtar çiftleri oluşturmak için dilediğiniz zaman API Console ürününe dönebilirsiniz. API Consoleiçindeki hizmet hesabı kimlik bilgileri hakkında daha fazla bilgi için API Consoleyardım dosyasındaki Hizmet hesapları bölümüne bakın.

Hizmet hesabının e-posta adresini not edin ve hizmet hesabının özel anahtar dosyasını uygulamanızın erişebileceği bir yerde depolayın. Uygulamanız sayesinde yetkili API çağrıları yapabilirler.

Hizmet hesabı için alan genelinde yetki verme

Google Workspace hesabınız varsa kuruluşun bir yöneticisi, Google Workspace alanındaki kullanıcılar adına kullanıcı verilerine erişmesi için bir uygulamaya yetki verebilir. Örneğin, bir Google Workspace alanındaki tüm kullanıcıların takvimlerine etkinlik eklemek için Google Calendar API'yi kullanan bir uygulama, kullanıcılar adına Google Calendar API'ye erişmek için bir hizmet hesabı kullanır. Hizmet hesabını, bir alandaki kullanıcılar adına verilere erişmesi için yetkilendirmek bazen bir hizmet hesabına "alan genelinde yetki verme" olarak da adlandırılır.

Bir hizmet hesabına alan genelinde yetki vermek için Google Workspace alanının süper yöneticisinin aşağıdaki adımları uygulaması gerekir:

  1. Google Workspace alanınızın Yönetici Konsolu'nda Ana menü > Güvenlik > Erişim ve veri denetimi > API Denetimleri'ne gidin.
  2. Alan genelinde yetki bölmesinde Alan Genelinde Yetkiyi Yönet'i seçin.
  3. Yeni ekle'yi tıklayın.
  4. İstemci Kimliği alanına hizmet hesabının İstemci Kimliği'ni girin. Hizmet hesabınızın istemci kimliğini Service accounts pagesayfasında bulabilirsiniz.
  5. OAuth kapsamları (virgülle ayrılmış) alanına, uygulamanıza erişim izni verilmesi gereken kapsamların listesini girin. Örneğin, uygulamanızın Google Drive API'sine ve Google Calendar API'sine alan genelinde tam erişime ihtiyacı varsa https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar adresini girin.
  6. Yetkilendir'i tıklayın.

Uygulamanız, artık alanınızdaki kullanıcılar olarak API çağrısı yapma yetkisine sahiptir ("kullanıcıların kimliğine bürünme"). Yetkilendirilmiş API çağrıları yapmaya hazırlanırken kullanıcının kimliğine bürünecek kullanıcıyı belirtirsiniz.

Yetkili bir API çağrısı yapmaya hazırlanıyor

Java

API Consoleöğesinden istemci e-posta adresini ve özel anahtarı aldıktan sonra, hizmet hesabının kimlik bilgilerinden ve uygulamanızın erişmesi gereken kapsamlardan GoogleCredential nesnesi oluşturmak için Java için Google API'leri İstemci Kitaplığı'nı kullanın. Örneğin:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

Google Cloud Platform'da bir uygulama geliştiriyorsanız onun yerine uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz. Bu da süreci basitleştirebilir.

Alan genelinde yetki verme

Hizmet hesabına alan genelinde erişim yetkisi verdiyseniz ve bir kullanıcı hesabının kimliğine bürünmek istiyorsanız kullanıcı nesnesinin e-posta adresini GoogleCredential nesnesinin createDelegated yöntemiyle belirtin. Örneğin:

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

Uygulamanızda Google API'lerini çağırmak için GoogleCredential nesnesini kullanın.

Python

API Consolecihazından istemci e-posta adresini ve özel anahtarı aldıktan sonra aşağıdaki adımları tamamlamak için Python için Google API'leri İstemci Kitaplığı'nı kullanın:

  1. Hizmet hesabının kimlik bilgilerinden ve uygulamanızın erişmesi gereken kapsamlardan bir Credentials nesnesi oluşturun. Örneğin:
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    Google Cloud Platform'da bir uygulama geliştiriyorsanız onun yerine uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz. Bu da süreci basitleştirebilir.

  2. Alan genelinde yetki verme

    Hizmet hesabına alan genelinde erişim yetkisi verdiyseniz ve bir kullanıcı hesabının kimliğine bürünmek istiyorsanız mevcut bir ServiceAccountCredentials nesnesinin with_subject yöntemini kullanın. Örneğin:

    delegated_credentials = credentials.with_subject('user@example.org')

Uygulamanızdaki Google API'lerini çağırmak için Credentials (Kimlik Bilgileri) nesnesini kullanın.

HTTP/REST

API Consoleöğesinden istemci kimliğini ve özel anahtarı aldıktan sonra, uygulamanızın aşağıdaki adımları tamamlaması gerekir:

  1. Başlık, hak talebi grubu ve imza içeren JSON Web Token (JWT, telaffuzlu "jot") oluşturun.
  2. Google OAuth 2.0 Yetkilendirme Sunucusundan bir erişim jetonu isteyin.
  3. Yetkilendirme Sunucusunun döndürdüğü JSON yanıtını işleyin.

Aşağıdaki bölümlerde bu adımları nasıl tamamlayacağınız açıklanmaktadır.

Yanıt bir erişim jetonu içeriyorsa, Google API çağırmak için erişim jetonunu kullanabilirsiniz. (Yanıt bir erişim jetonu içermiyorsa, JWT ve jeton isteğiniz doğru şekilde oluşturulmamış olabilir veya hizmet hesabı, istenen kapsamlara erişim iznine sahip olmayabilir.)

Erişim jetonunun süresi dolduğunda uygulamanız başka bir JWT oluşturur, imzalar ve başka bir erişim jetonu ister.

Sunucu uygulamanız, Google Yetkilendirme Sunucusundan bir jeton istemek için bir JWT kullanır, ardından bir Google API uç noktasını çağırmak için jetonu kullanır. Son kullanıcıya dahil değildir.

Bu bölümün geri kalanında JWT oluşturma, JWT'yi imzalama, erişim jetonu isteği oluşturma ve yanıtı işleme ile ilgili ayrıntılar açıklanmaktadır.

JWT oluşturma

JWT üç parçadan oluşur: başlık, hak talebi grubu ve imza. Başlık ve hak talebi grubu JSON nesneleri. Bu JSON nesneleri UTF-8 bayt olarak serileştirilir ve daha sonra Base64url kodlaması kullanılarak kodlanır. Bu kodlama, tekrarlanan kodlama işlemleri nedeniyle kodlama değişikliklerine dayanıklıdır. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir.

JWT'nin yapısı şöyledir:

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

İmzanın temel dizesi şu şekildedir:

{Base64url encoded header}.{Base64url encoded claim set}
JWT üstbilgisini oluşturma

Üstbilgi, imzalama algoritmasını ve onaylamanın biçimini belirten iki alandan oluşur. Her iki alan da zorunludur ve her alanda yalnızca bir değer bulunur. İlave algoritmalar ve biçimler kullanıma sunuldukça bu başlık da uygun şekilde değişecektir.

Hizmet hesapları, RSA SHA-256 algoritmasını ve JWT jeton biçimini kullanır. Sonuç olarak, üstbilginin JSON gösterimi aşağıdaki gibidir:

{"alg":"RS256","typ":"JWT"}

Bunun Base64url gösterimi şu şekildedir:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT hak talebi grubunu oluşturma

JWT hak talebi grubu, istenen izinler (kapsamlar), jetonun hedefi, kartı veren kuruluş, jetonun verildiği saat ve jetonun kullanım ömrü de dahil olmak üzere JWT hakkında bilgi içerir. Alanların çoğu zorunludur. JWT başlığı gibi, JWT hak talebi grubu da JSON nesnesidir ve imzanın hesaplanmasında kullanılır.

Gerekli hak talepleri

JWT hak talebi grubundaki gerekli hak talepleri aşağıda gösterilmektedir. Bunlar, hak talebi grubundaki herhangi bir sırada gösterilebilir.

Ad Açıklama
iss Hizmet hesabının e-posta adresi.
scope Uygulamanın istediği izinlerin boşlukla sınırlandırılmış listesi.
aud İddianın amaçlanan hedefinin tanımlayıcısı. Erişim jetonu isteğinde bulunurken bu değer her zaman https://oauth2.googleapis.com/token olur.
exp Onayın geçerlilik bitiş zamanı (1 Ocak 1970, 00:00:00 UTC) Bu değer, yayınlanma tarihinden itibaren en fazla 1 saat sürebilir.
iat Onayın verildiği saat, 01:00:00 UTC, 1 Ocak 1970 tarihinden bu yana saniye olarak belirtilir.

JWT hak talebi grubundaki zorunlu alanların JSON temsili aşağıda gösterilmiştir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
Ek hak talepleri

Bazı kurumsal durumlarda uygulama, kuruluştaki belirli bir kullanıcı adına işlem yapmak için alan genelinde yetkiyi kullanabilir. Bir uygulamanın bir kullanıcının kimliğine bürünebilmesi için bu kimliğe bürünme kimliğine izin verilmesi gerekir. Bu izin genellikle bir süper yönetici tarafından işlenir. Daha fazla bilgi için Alan genelinde yetki ile API erişimini kontrol etme başlıklı makaleye bakın.

Uygulamanın bir kaynağa yetki verilmiş erişim izni veren bir erişim jetonu almak için kullanıcının alanının e-posta adresini, sub alanının değeri olarak ayarlanan JWT hak talebine ekleyin.

Ad Açıklama
sub Uygulamanın yetki verilmiş erişim isteğinde bulunduğu kullanıcının e-posta adresi.

Uygulamanın bir kullanıcının kimliğine bürünme izni yoksa sub alanını içeren bir erişim jetonu isteğine verilen yanıt bir hata olur.

Aşağıda, sub alanını içeren bir JWT hak talebi grubu örneği gösterilmektedir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWT hak talebi grubunu kodlama

JWT başlığı gibi, JWT hak talebi grubu da UTF-8 ve Base64url güvenli olacak şekilde serileştirilmelidir. Aşağıda, bir JWT Hak Talebi grubunun JSON temsili örneği verilmiştir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
İmza hesaplanıyor

JSON Web İmzası (JWS), JWT'nin imzasını oluşturan mekaniklere yol gösteren spesifikasyondur. İmzanın girişi, aşağıdaki içeriğin bayt dizisidir:

{Base64url encoded header}.{Base64url encoded claim set}

İmza hesaplanırken JWT başlığındaki imzalama algoritması kullanılmalıdır. Google OAuth 2.0 Yetkilendirme Sunucusu tarafından desteklenen tek imzalama algoritması, SHA-256 karma oluşturma algoritmasının kullanıldığı RSA'dır. Bu, JWT başlığındaki alg alanında RS256 olarak ifade edilir.

Girişin UTF-8 gösterimini, SHA256withRSA (SHA-SA5-KKCS1-V1_5-SIGN olarak da bilinir) Google API Consoleile alınan özel anahtarla imzalayın. Çıkış bir bayt dizisi olacaktır.

Ardından imza Base64url olarak kodlanmalıdır. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir. Sonuç, JWT'dir. Şöyle olmalıdır (netlik sağlamak için satır sonları eklendi):

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

Aşağıda, Base64url kodlamasından önce bir JWT örneği verilmiştir:

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

Aşağıda, imzalanmış ve iletim için hazır olan bir JWT örneği verilmiştir:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

Erişim jetonu isteğinde bulunma

Bir uygulama, imzalı JWT'yi oluşturduktan sonra erişim jetonu istemek için kullanabilir. Bu erişim jetonu isteği bir HTTPS POST isteği ve gövde URL kodlamalı. URL aşağıda gösterilmiştir:

https://oauth2.googleapis.com/token

HTTPS POST isteğinde aşağıdaki parametreler gereklidir:

Ad Açıklama
grant_type Aşağıdaki dizeyi kullanın. URL kodlamalı:urn:ietf:params:oauth:grant-type:jwt-bearer
assertion İmza dahil olmak üzere JWT.

Aşağıda, bir erişim jetonu isteğinde kullanılan HTTPS POST isteğinin ham dökümü verilmiştir:

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

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

Aşağıda aynı istek (curl kullanılarak):

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

Yanıtı işleme

JWT ve erişim jetonu isteği düzgün şekilde oluşturulduysa ve hizmet hesabının işlemi gerçekleştirme izni varsa Yetkilendirme Sunucusundan alınan JSON yanıtı bir erişim jetonu içerir. Aşağıda örnek bir yanıt verilmiştir:

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

Erişim jetonları expires_in değeriyle belirtilen süre boyunca yeniden kullanılabilir.

Google API'lerini çağırma

Java

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

  1. GoogleCredential nesnesini kullanarak çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Örneğin:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. Hizmet nesnesi tarafından sağlanan arayüzü kullanarak API hizmetine istek gönderin. Örneğin, heyecan verici-örnek-123 projesinde Cloud SQL veritabanlarının örneklerini listelemek için:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

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

  1. çağırmak istediğiniz API için hizmet nesnesi oluşturun. build işlevini API'nin adı ve sürümüyle, yetkili Credentials nesnesiyle çağırarak bir hizmet nesnesi oluşturursunuz. Örneğin, Cloud SQL Management API'nin 1beta3 sürümünü çağırmak için:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. Hizmet nesnesi tarafından sağlanan arayüzü kullanarak API hizmetine istek gönderin. Örneğin, heyecan verici-örnek-123 projesinde Cloud SQL veritabanlarının örneklerini listelemek için:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

Uygulamanız erişim jetonu aldıktan sonra, bu API'nin gerektirdiği erişim kapsamlarının verilmiş olması durumunda, jetonu belirli bir hizmet hesabı veya kullanıcı hesabı adına bir Google API'ye çağrı yapmak için kullanabilirsiniz. Bunu yapmak için access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API 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

Erişim jetonlarının geçerlilik süresi

Google OAuth 2.0 Yetkilendirme Sunucusu tarafından verilen erişim jetonlarının süresi, expires_in değeri tarafından sağlanan süre sonunda dolar. Erişim jetonunun süresi dolduğunda uygulama başka bir JWT oluşturmalı, imzalamalı ve başka bir erişim jetonu istemelidir.

JWT hata kodları

error alan error_description alan Anlamı Çözüm
unauthorized_client Unauthorized client or scope in request. Alan genelinde yetki kullanmaya çalışıyorsanız hizmet hesabı, kullanıcının alanının Yönetici Konsolu'nda yetkilendirilmemiştir.

Hizmet hesabının, sub hak talebinde (alan) bulunan kullanıcı için Yönetici Konsolu'nun Alan genelinde yetki sayfasında yetkilendirildiğinden emin olun.

Genellikle birkaç dakika sürse de yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara dağıtılması 24 saati bulabilir.

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. Yönetici Konsolu'ndaki müşteri kimliği (sayısal) yerine müşteri e-posta adresi kullanılarak bir hizmet hesabı yetkilendirildi. Yönetici Konsolu'ndaki Alan genelinde yetki sayfasında istemciyi kaldırın ve sayısal kimlikle tekrar ekleyin.
access_denied (herhangi bir değer) Alan genelinde yetki kullanıyorsanız istenen kapsamlardan bir veya daha fazlası Yönetici Konsolu'nda yetkilendirilmemiştir.

Hizmet hesabının, sub hak talebinde (alan) kullanıcı için Yönetici Konsolu'nun Alan genelinde yetki sayfasında yetkilendirildiğinden ve JWT'nizin scope hak talebinde bulunduğunuz tüm kapsamları içerdiğinden emin olun.

Genellikle birkaç dakika sürse de yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara dağıtılması 24 saati bulabilir.

admin_policy_enforced (herhangi bir değer) 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 verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme başlıklı Google Workspace Yönetici yardım makalesine göz atın.

invalid_client (herhangi bir değer)

OAuth istemcisi veya JWT jetonu geçersiz ya da yanlış yapılandırılmış.

Ayrıntılar için hata açıklamasına bakın.

JWT jetonunun geçerli olduğundan ve doğru hak talepleri içerdiğinden emin olun.

OAuth istemcisi ve hizmet hesabının doğru şekilde yapılandırıldığından ve doğru e-posta adresini kullandığınızdan emin olun.

JWT jetonunun doğru olduğundan ve istekteki istemci kimliği için verildiğinden emin olun.

invalid_grant Not a valid email. Kullanıcı mevcut değil. sub hak talebi (alandaki) e-posta adresinin doğru olup olmadığını kontrol edin.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

Bu, genellikle yerel sistem saatinin doğru olmadığı anlamına gelir. Bu durum, exp değeri gelecekte 65 dakikadan uzunsa veya exp değeri iat değerinden düşükse de ortaya çıkabilir.

JWT'nin oluşturulduğu sistemdeki saatin doğru olduğundan emin olun. Gerekirse zamanınızı Google NTP ile senkronize edin.

invalid_grant Invalid JWT Signature.

JWT onayı, müşteri e-postasında tanımlanan hizmet hesabıyla ilişkili olmayan özel bir anahtarla imzalanır veya kullanılan anahtar silinmiş, devre dışı bırakılmış ya da süresi dolmuştur.

Alternatif olarak JWT onayı yanlış kodlanabilir. Yeni satırlar veya dolgu eşit işaretleri olmadan Base64 kodlu olmalıdır.

JWT hak talebi grubunun kodunu çözün ve onayı imzalayan anahtarın hizmet hesabıyla ilişkilendirildiğini doğrulayın.

JWT'nin doğru şekilde oluşturulduğundan emin olmak için Google tarafından sağlanan OAuth kitaplığını kullanmayı deneyin.

invalid_scope Invalid OAuth scope or ID token audience provided. Kapsam istenmedi (boş kapsam listesi) veya istenen kapsamlardan biri mevcut değil (yani geçersiz).

JWT'nin scope hak talebinin (alanın) doldurulduğundan emin olun. Hatanın veya yazım hatalarının olmadığından emin olmak için içerdiği kapsamları, kullanmak istediğiniz API'lerin belgelenen kapsamlarıyla karşılaştırın.

scope hak talebindeki kapsam listesinin virgülle değil, boşlukla ayrılması gerektiğini unutmayın.

disabled_client The OAuth client was disabled. JWT onayını imzalamak için kullanılan anahtar devre dışı.

Google API Consolebölümüne gidip IAM ve Yönetici > Hizmet Hesapları bölümünde, onayı imzalamak için kullanılan "Anahtar Kimliğini" içeren hizmet hesabını etkinleştirin.

org_internal This client is restricted to users within its organization. İ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.

Kimlik doğrulaması için kuruluştan bir hizmet hesabı kullanın. OAuth uygulamanız için kullanıcı türü yapılandırmasını onaylayın.

Ek: OAuth olmadan hizmet hesabı yetkilendirme

Bazı Google API'leriyle, OAuth 2.0 erişim jetonu yerine doğrudan bir taşıma jetonu olarak, imzalı bir JWT kullanarak yetkili API çağrıları yapabilirsiniz. Bu mümkün olduğunda, API çağrısı yapmadan önce Google'ın yetkilendirme sunucusuna ağ isteğinde bulunmaktan kaçınabilirsiniz.

Aramak istediğiniz API'nin Google API GitHub deposunda yayınlanmış bir hizmet tanımı varsa erişim jetonu yerine bir JWT kullanarak yetkili API çağrıları yapabilirsiniz. Bunu yapmak için:

  1. Yukarıda açıklandığı şekilde bir hizmet hesabı oluşturun. Hesabı oluştururken aldığınız JSON dosyasını sakladığınızdan emin olun.
  2. Herhangi bir standart JWT kitaplığını (ör. jwt.io'daki gibi) kullanarak başlık ve yük içeren bir JWT oluşturun. Örneğin:
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • Başlıktaki kid alanı için hizmet hesabınızın özel anahtar kimliğini belirtin. Bu değeri, hizmet hesabı JSON dosyanızın private_key_id alanında bulabilirsiniz.
    • iss ve sub alanları için hizmet hesabınızın e-posta adresini belirtin. Bu değeri, hizmet hesabı JSON dosyanızın client_email alanında bulabilirsiniz.
    • aud alanı için API uç noktasını belirtin. Örneğin: https://SERVICE.googleapis.com/.
    • iat alanı için geçerli Unix saatini, exp alanı için ise JWT'nin süresinin dolacağı zamanı tam olarak 3600 saniye olarak belirtin.

Hizmet hesabı JSON dosyanızda bulunan özel anahtarı kullanarak JWT'yi RSA-256 ile imzalayın.

Örneğin:

Java

google-api-java-client ve java-jwt kullanarak:

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

Python

PyJWT kullanarak:

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. Taşıyıcı jetonu olarak imzalı JWT'yi kullanarak API'yi çağırın:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com