Google, Siyah topluluklar için ırksal eşitliği geliştirmeye kararlıdır. Nasıl olduğunu gör.

Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma

Google OAuth 2.0 sistemi, bir web uygulaması ile bir Google hizmeti arasındaki gibi sunucular arası etkileşimleri destekler. Bu senaryo için, bireysel bir son kullanıcı yerine uygulamanıza ait bir hesap olan bir hizmet hesabına ihtiyacınız vardır. Uygulamanız, hizmet hesabı adına Google API'lerini çağırır, böylece kullanıcılar doğrudan ilgilenmez. Bu senaryoya bazen "iki aşamalı OAuth" veya "2LO" adı verilir. (İ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.)

Tipik olarak, bir 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 kullanan bir uygulama, Google Cloud Datastore API'ye yaptığı çağrıların kimliğini doğrulamak için bir hizmet hesabı kullanır.

Google Workspace etki alanı yöneticileri, hizmet hesaplarına etki alanındaki kullanıcılar adına kullanıcı verilerine erişim için etki alanı çapında yetki verebilir.

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

Genel Bakış

Sunucudan sunucuya etkileşimleri desteklemek için önce API Console'da 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 belirteci 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'larını çağırmak için erişim jetonunu kullanabilir.

Bir hizmet hesabı oluşturmak

Bir hizmet hesabının kimlik bilgileri, benzersiz ve en az bir genel / özel anahtar çifti olan oluşturulmuş bir e-posta adresini içerir. Etki alanı çapında yetkilendirme etkinleştirilirse, bir istemci kimliği de hizmet hesabının kimlik bilgilerinin bir parçasıdır.

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

Uygulamanız Google Compute Engine'de çalışıyorsa, projenizi oluşturduğunuzda da otomatik olarak bir hizmet hesabı oluşturulur, ancak bir Google Compute Engine örneği oluşturduğunuzda uygulamanızın erişmesi gereken kapsamları belirtmeniz gerekir. Daha fazla bilgi için bkz. Hizmet hesaplarını kullanmak için bir örnek hazırlama .

Uygulamanız Google App Engine veya Google Compute Engine'de çalışmıyorsa, bu kimlik bilgilerini Google API Console'den edinmeniz gerekir. Hizmet hesabı kimlik bilgileri oluşturmak veya önceden oluşturduğunuz genel kimlik bilgilerini görüntülemek için aşağıdakileri yapın:

  1. Service accounts page açın.
  2. If prompted, select a project, or create a new one.
  3. Click hizmet hesabı oluşturun.
  4. Hizmet hesabı ayrıntıları altında, hizmet hesabı için bir ad, kimlik ve açıklama yazın, ardından Oluştur'u tıklatın.
  5. İsteğe bağlı: Hizmet hesabı izinleri altında, hizmet hesabına vermek için IAM rollerini seçin ve ardından Devam'ı tıklatın.
  6. İsteğe bağlı: Kullanıcılara bu hizmet hesabına erişim izni ver altında, hizmet hesabını kullanmalarına ve yönetmelerine izin verilen kullanıcıları veya grupları ekleyin.
  7. Anahtar ve ardından Oluştur'u tıklayın.

Yeni ortak / özel anahtar çiftiniz oluşturulur ve makinenize indirilir; özel anahtarın tek kopyası olarak işlev görür. Güvenli bir şekilde saklamaktan sorumlusunuz. Bu anahtar çiftini kaybederseniz, yeni bir anahtar çifti oluşturmanız gerekir.

Hizmet hesabına etki alanı çapında G Suite yetkisi vermeniz gerekiyorsa, oluşturduğunuz hizmet hesabının e-posta adresini tıklayın, ardından değeri Benzersiz Kimlik kutusundan kopyalayın.

Yetkiyi hizmet hesabına devretmek için, istemci kimliği olarak kopyaladığınız değeri kullanın.

E-posta adresini, genel anahtar parmak izlerini ve diğer bilgileri görüntülemek veya ek genel / özel anahtar çiftleri oluşturmak için istediğiniz zaman API Console'a dönebilirsiniz. API Console'da hizmet hesabı kimlik bilgileri hakkında daha fazla ayrıntı için, API Console yardım dosyasındaki Hizmet hesapları'na bakın.

Hizmet hesabının e-posta adresini not alın ve hizmet hesabının özel anahtar dosyasını uygulamanızın erişebileceği bir konumda saklayın. Uygulamanızın yetkili API çağrıları yapması için bunlara ihtiyacı var.

Hizmet hesabına etki alanı çapında yetki verme

Bir Google Workspace hesabınız varsa, kuruluşun yöneticisi bir uygulamaya Google Workspace alanındaki kullanıcılar adına kullanıcı verilerine erişim yetkisi verebilir. Örneğin, bir Google Workspace etki alanındaki tüm kullanıcıların takvimlerine etkinlik eklemek için Google Takvim API'sini kullanan bir uygulama, kullanıcılar adına Google Takvim API'sına erişmek için bir hizmet hesabı kullanır. Bir hizmet hesabına, bir etki alanındaki kullanıcılar adına verilere erişim yetkisi verme, bazen bir hizmet hesabına "etki alanı genelinde yetki yetkisi verme" olarak adlandırılır.

Etki alanı çapında yetkiyi bir hizmet hesabına devretmek için, önce Service accounts page'de var olan bir hizmet hesabı için etki alanı çapında yetkilendirmeyi etkinleştirin veya etki alanı çapında yetkilendirme etkinleştirilmiş yeni bir hizmet hesabı oluşturun .

Ardından, Google Workspace alan adının bir süper yöneticisinin aşağıdaki adımları tamamlaması gerekir:

  1. Google Workspace alanınızın Yönetici konsolundan Ana > Güvenlik> API Denetimleri'ne gidin .
  2. Etki Alanı çapında temsil bölmesinde, Etki Alanı Çapında Temsilciliği Yönet'i seçin.
  3. Yeni ekle'yi tıklayın.
  4. Müşteri Kimliği alanına hizmet hesabının Müşteri Kimliğini girin . Hizmet hesabınızın müşteri kimliğini Service accounts page'de 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'ye ve Google Takvim API'ye alan genelinde tam erişime ihtiyacı varsa , şu adresi girin: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / calendar .
  6. Yetkilendir'i tıklayın.

Uygulamanız artık etki alanınızdaki kullanıcılar olarak API çağrıları yapma (kullanıcıların "kimliğine bürünme") yetkisine sahiptir. Yetkili API çağrıları yapmaya hazırlandığınızda, kimliğine bürünecek kullanıcıyı belirtirsiniz.

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

Java

API Console'dan istemci e-posta adresini ve özel anahtarı GoogleCredential sonra, hizmet hesabının kimlik bilgilerinden ve uygulamanızın erişmesi gereken kapsamlardan bir Google Kimlik 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, bunun yerine uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz, bu da süreci basitleştirebilir.

Etki alanı çapında yetki verin

Hizmet hesabına etki alanı çapında erişim yetkisi GoogleCredential ve bir kullanıcı hesabının kimliğine bürünmek istiyorsanız, GoogleCredential nesnesinin createDelegated yöntemiyle kullanıcı hesabının e-posta adresini 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 Console'dan 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, bunun yerine uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz, bu da süreci basitleştirebilir.

  2. Etki alanı çapında yetki verin

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

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

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

HTTP / REST

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

  1. Bir başlık, bir talep kümesi ve bir imza içeren bir JSON Web Jetonu (JWT, telaffuz edilir, "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ümler, bu adımların nasıl tamamlanacağını açıklamaktadır.

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

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

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

Bu bölümün geri kalanı, bir JWT oluşturma, JWT'yi imzalama, erişim belirteci talebini oluşturma ve yanıtı işleme tabi tutma özelliklerini açıklar.

Bir JWT oluşturma

Bir JWT üç bölümden oluşur: bir başlık, bir talep kümesi ve bir imza. Başlık ve talep kümesi JSON nesneleridir. Bu JSON nesneleri UTF-8 bayt olarak serileştirilir, ardından Base64url kodlaması kullanılarak kodlanır. Bu kodlama, tekrarlanan kodlama işlemleri nedeniyle kodlama değişikliklerine karşı direnç sağlar. Başlık, talep kümesi ve imza bir nokta ( . ) Karakteriyle birlikte birleştirilir.

Bir JWT aşağıdaki gibi oluşur:

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

İmza için temel dize aşağıdaki gibidir:

{Base64url encoded header}.{Base64url encoded claim set}
JWT başlığının oluşturulması

Başlık, imzalama algoritmasını ve iddianın biçimini gösteren iki alandan oluşur. Her iki alan da zorunludur ve her alanın yalnızca bir değeri vardır. Ek algoritmalar ve formatlar tanıtıldıkça, bu başlık buna göre değişecektir.

Hizmet hesapları, RSA SHA-256 algoritmasına ve JWT belirteç biçimine dayanır. Sonuç olarak, başlığın JSON gösterimi aşağıdaki gibidir:

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

Bunun Base64url gösterimi aşağıdaki gibidir:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT talep kümesinin oluşturulması

JWT talep seti, talep edilen izinler (kapsamlar), jetonun hedefi, yayıncı, jetonun verildiği zaman ve jetonun ömrü dahil olmak üzere JWT hakkında bilgi içerir. Alanların çoğu zorunludur. JWT başlığı gibi, JWT talep kümesi de bir JSON nesnesidir ve imzanın hesaplanmasında kullanılır.

Gerekli iddialar

JWT talep setindeki gerekli talepler aşağıda gösterilmektedir. Talep setinde herhangi bir sırada görünebilirler.

İsim Soyisim 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 bir tanımlayıcısı. Erişim belirteci isteğinde bulunurken bu değer her zaman https://oauth2.googleapis.com/token .
exp 1 Ocak 1970 00:00:00 UTC'den bu yana saniye olarak belirtilen, onaylamanın sona erme zamanı. Bu değer, yayınlanma saatinden sonra maksimum 1 saat olabilir.
iat Onaylama işleminin yayınlandığı saat, 1 Ocak 1970 00:00:00 UTC'den bu yana saniye olarak belirtilir.

Bir JWT talep kümesindeki 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 iddialar

Bazı kurumsal durumlarda, bir uygulama, bir kuruluştaki belirli bir kullanıcı adına hareket etmek için etki alanı çapında yetkilendirmeyi kullanabilir. Bir uygulamanın bir kullanıcının kimliğine bürünebilmesi için bu tür bir kimliğe bürünme izni verilmelidir ve genellikle bir süper yönetici tarafından ele alınır. Daha fazla bilgi için, bkz. Etki alanı çapında yetkilendirme ile API erişimini kontrol etme .

Bir uygulamaya bir kaynağa erişim yetkisi veren bir erişim belirteci almak için, kullanıcının e-posta adresini JWT talep kümesine sub alanın değeri olarak dahil edin.

İsim Soyisim Açıklama
sub Uygulamanın yetki verilmiş erişim istediği kullanıcının e-posta adresi.

Bir uygulamanın bir kullanıcının kimliğine bürünme izni yoksa, sub alanı içeren bir erişim belirteci isteğine verilen yanıt bir hata olacaktır.

sub alanı içeren bir JWT talep kümesi örneği aşağıda gösterilmiştir:

{
  "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 talep kümesini kodlama

JWT başlığı gibi, JWT talep kümesi de UTF-8'e serileştirilmeli ve Base64url-güvenli kodlanmalıdır. Aşağıda, bir JWT Talep kümesinin JSON temsiline bir örnek 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 için imza oluşturma mekaniğine rehberlik eden belirtimdir. İmza için girdi, 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 algoritması kullanan RSA'dır. Bu, JWT başlığındaki alg alanında RS256 olarak ifade edilir.

Google API Console'ten elde edilen özel anahtarla SHA256withRSA (SHA-256 hash fonksiyonu ile RSASSA-PKCS1-V1_5-SIGN olarak da bilinir) kullanarak girdinin UTF-8 temsilini imzalayın. Çıktı bir bayt dizisi olacaktır.

İmza daha sonra Base64url ile kodlanmış olmalıdır. Başlık, talep kümesi ve imza bir nokta ( . ) Karakteriyle birlikte birleştirilir. Sonuç JWT'dir. Aşağıdakiler olmalıdır (netlik için satır sonları eklenmiştir):

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

Aşağıda Base64url kodlamasından önceki 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 aktarıma hazır bir JWT örneği verilmiştir:

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

Erişim belirteci talebinde bulunma

İmzalı JWT'yi oluşturduktan sonra, bir uygulama bunu bir erişim belirteci istemek için kullanabilir. Bu erişim belirteci isteği bir HTTPS POST isteğidir ve gövde URL kodludur. URL aşağıda gösterilmiştir:

https://oauth2.googleapis.com/token

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

İsim Soyisim Açıklama
grant_type Aşağıdaki dizeyi, gerektiği şekilde URL kodlamalı olarak kullanın: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion İmza dahil JWT.

Aşağıda, erişim belirteci isteğinde kullanılan HTTPS POST isteğinin ham dökümü bulunmaktadır:

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

curl kullanan aynı istek aşağıdadır:

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 belirteci isteği uygun şekilde oluşturulmuşsa ve hizmet hesabının işlemi gerçekleştirme izni varsa, Yetkilendirme Sunucusundan gelen JSON yanıtı bir erişim belirteci 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 belirteçleri, expires_in değeriyle belirtilen süre aralığı 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 arabirimi kullanarak API hizmetine istekte bulunun . Örneğin, heyecan verici örnek 123 projesinde Cloud SQL veritabanı ö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 bir hizmet nesnesi oluşturun. API adı ve sürümü ve yetkili Credentials nesnesiyle build işlevini çağırarak bir hizmet nesnesi build . Örneğin, Cloud SQL Administration API'sinin 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 arabirimi kullanarak API hizmetine istekte bulunun . Örneğin, heyecan verici örnek 123 projesinde Cloud SQL veritabanı örneklerini listelemek için:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP / REST

Uygulamanız bir erişim jetonu aldıktan sonra, jetonu, API için gerekli olan erişim kapsamları verilmişse, belirli bir hizmet hesabı veya kullanıcı hesabı adına bir Google API’ya çağrı yapmak için kullanabilirsiniz. Bunu yapmak için, bir access_token sorgu parametresi veya bir Authorization HTTP üstbilgisi Bearer değeri access_token API'ye yapılan bir isteğe erişim belirtecini access_token . Sorgu dizeleri sunucu günlüklerinde görünme eğiliminde olduğundan, mümkün olduğunda HTTP başlığı 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'sini çağırırken ).

Tüm Google API'lerini deneyebilir ve kapsamlarını OAuth 2.0 Playground'da görüntüleyebilirsiniz .

HTTP GET örnekleri

Authorization: Bearer HTTP üst bilgisini kullanan drive.files uç noktasına (Drive Files API) yapılan bir çağrı aşağıdaki gibi görünebilir. Kendi erişim jetonunuzu belirtmeniz gerektiğini unutmayın:

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

Burada, access_token sorgu dizesi parametresini kullanan kimliği doğrulanmış kullanıcı için aynı API'ye bir çağrı verilmiştir:

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

curl örnekleri

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

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

Veya alternatif olarak, sorgu dizesi parametresi seçeneği:

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

Erişim belirteçlerinin süresi dolduğunda

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ürenin ardından sona erer. Bir erişim belirtecinin süresi dolduğunda, uygulama başka bir JWT oluşturmalı, imzalamalı ve başka bir erişim belirteci istemelidir.

JWT hata kodları

error alanı error_description alanı Anlam Nasıl çözülür
unauthorized_client Unauthorized client or scope in request. Alan genelinde yetkilendirmeyi kullanmaya çalışıyorsanız, hizmet hesabı, kullanıcının alan adının Yönetici konsolunda yetkilendirilmez.

sub hak talebindeki (alan) kullanıcı için Yönetici konsolunun Alan genelinde yetkilendirme sayfasında hizmet hesabının yetkilendirildiğinden emin olun.

Genellikle birkaç dakika sürse de, yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara yayılması 24 saate kadar sürebilir.

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

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

Genellikle birkaç dakika sürse de, yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara yayılması 24 saate kadar sürebilir.

invalid_grant Not a valid email. Kullanıcı mevcut değil. sub hak talebindeki (alan) 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.

Genellikle, yerel sistem saatinin doğru olmadığı anlamına gelir. exp değeri gelecekte iat değerinden 65 dakikadan fazlaysa veya exp değeri iat değerinden düşükse de olabilir.

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 beyanı, müşteri e-postası tarafından tanımlanan hizmet hesabıyla ilişkili olmayan özel bir anahtarla imzalanır.

Alternatif olarak, JWT ifadesi yanlış kodlanmış olabilir - yeni satırlar olmadan veya eşit işaretleri doldurmadan Base64 olarak kodlanmış olmalıdır.

JWT talep kümesinin kodunu çözün ve onaylamayı imzalayan anahtarın hizmet hesabıyla ilişkili olduğunu doğrulayın.

JWT'nin doğru şekilde oluşturulduğundan emin olmak için Google tarafından sağlanan bir OAuth kitaplığı 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 talebinin (alan) doldurulduğundan emin olun ve herhangi bir hata veya yazım hatası olmadığından emin olmak için içerdiği kapsamları kullanmak istediğiniz API'lerin belgelenmiş kapsamlarıyla karşılaştırın.

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

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

Google API Console'e gidin ve IAM ve Yönetici> Hizmet Hesapları altında, onaylamayı imzalamak için kullanılan "Anahtar Kimliği" ni içeren hizmet hesabını etkinleştirin.

Ek: OAuth olmadan hizmet hesabı yetkilendirmesi

Bazı Google API'lerinde, OAuth 2.0 erişim jetonu yerine doğrudan bir taşıyıcı jeton olarak imzalanmış bir JWT kullanarak yetkili API çağrıları yapabilirsiniz. Bu mümkün olduğunda, bir API çağrısı yapmadan önce Google'ın yetkilendirme sunucusuna bir ağ isteğinde bulunmak zorunda kalmayabilirsiniz.

Çağırmak istediğiniz API'nin Google API'leri GitHub havuzunda yayınlanmış bir hizmet tanımı varsa, erişim jetonu yerine bir JWT kullanarak yetkili API çağrıları yapabilirsiniz. Böyle yaparak:

  1. Yukarıda açıklandığı gibi bir hizmet hesabı oluşturun . Hesabı oluşturduğunuzda aldığınız JSON dosyasını sakladığınızdan emin olun.
  2. Jwt.io'da bulunanlar gibi herhangi bir standart JWT kitaplığını kullanarak, aşağıdaki örnekte olduğu gibi bir başlık ve yük ile bir JWT oluşturun:
    {
      "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
    }
    • 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 zamanını belirtin ve exp alanı için JWT'nin sona ereceği tam olarak 3600 saniye sonraki zamanı 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ı jeton 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