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

Google OAuth 2.0 sistemi, bir web uygulaması ile bir Google hizmeti arasındaki etkileşimler gibi sunucular arası etkileşimleri destekler. Bu senaryoda hizmet hesabı gerekir. Bu hesap, son kullanıcı yerine uygulamanıza ait bir hesaptır. Uygulamanız, hizmet hesabı adına Google API'lerini çağırdığı için kullanıcılar doğrudan bu işleme 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.)

Genel olarak 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'sine yapılan çağrıların kimliğini doğrulamak için bir hizmet hesabı kullanacak.

Google Workspace alan yöneticileri, hizmet hesaplarına alan genelinde yetki vererek alandaki kullanıcılar adına kullanıcı verilerine erişmelerine de izin verebilir.

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

Genel bakış

Sunucular arası etkileşimleri desteklemek amacıyla ilk olarak API Consoleiç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 erişim jetonu istemek için hizmet hesabının kimlik bilgilerini kullanarak yetkili API çağrıları yapmaya hazır olur.

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 istemci kimliği, hizmet hesabı kimlik bilgilerinin de bir parçasıdır.

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

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

Uygulamanız Google App Engine veya Google Compute Engine'de çalışmıyorsa bu kimlik bilgilerini Google API Consoleüzerinden 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 şunları yapın:

tutucu2 l10n-yer

Öncelikle bir hizmet hesabı oluşturun:

  1. Service accounts pageaçın.
  2. If prompted, select a project, or create a new one.
  3. Hizmet hesabı oluştur'u .
  4. Hizmet hesabı ayrıntıları altında, hizmet hesabı için bir ad, kimlik ve açıklama yazın, ardından Oluştur ve devam et seçeneğine tıklayın.
  5. İsteğe bağlı: Bu hizmet hesabına projeye erişim izni ver altında, hizmet hesabına verilecek IAM rollerini seçin.
  6. Devam'ı tıklayın.
  7. İsteğe bağlı: Kullanıcılara bu hizmet hesabına erişim izni ver altında, hizmet hesabını kullanmasına ve yönetmesine izin verilen kullanıcıları veya grupları ekleyin.
  8. Bitti'yi tıklayın.

Ardından, bir hizmet hesabı anahtarı oluşturun:

  1. Oluşturduğunuz hizmet hesabının e-posta adresine tıklayın.
  2. Anahtarlar sekmesini tıklayın.
  3. Anahtar ekle açılır listesinde Yeni anahtar oluştur öğesini seçin.
  4. Oluştur'u tıklayın.

Yeni genel/özel anahtar çiftiniz oluşturulur ve makinenize indirilir; özel anahtarın tek kopyası olarak hizmet eder. Güvenli bir şekilde saklamaktan siz sorumlusunuz. Bu anahtar çiftini kaybederseniz, yeni bir tane oluşturmanız gerekecektir.

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

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, yetkili API çağrıları yapabilmeleri için bu özelliklere ihtiyaç duyar.

Hizmet hesabına alan genelinde yetki verme

Kuruluşun bir Workspace yöneticisi, Google Workspace hesabını kullanarak Google Workspace alanındaki kullanıcılar adına bir uygulamanın Workspace kullanıcı verilerine erişmesine izin 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ın, alandaki kullanıcılar adına verilere erişmesi için yetki verilmesi, bazen bir hizmet hesabına "alan genelinde yetki verme" olarak 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ı tamamlaması 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 seçeneğini belirleyin.
  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 pagebölümünde 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 alan genelinde Google Drive API'ye ve Google Calendar API'ye 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 Workspace alanınızda kullanıcı olarak API çağrısı yapma yetkisine sahiptir ("kullanıcıların kimliğine bürünme"). Yetki verilmiş bu API çağrıları yapmaya hazır olduğunuzda, kimliğine bürünülecek kullanıcıyı açıkça belirtirsiniz.

Yetki verilmiş bir API çağrısı yapmaya hazırlanıyor

Java

API Consoleüzerinden 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 bunun yerine uygulama varsayılan kimlik bilgilerini kullanarak süreci basitleştirebilirsiniz.

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("workspace-user@example.com");

Yukarıdaki kod, createDelegated() yöntemini çağırmak için GoogleCredential nesnesini kullanır. createDelegated() yönteminin bağımsız değişkeni, Workspace hesabınıza ait bir kullanıcı olmalıdır. İstekte bulunan kodunuz, hizmet hesabınızı kullanarak Google API'lerini çağırmak için bu kimlik bilgisini kullanır.

Python

API Consoleürününden 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 uygulama varsayılan kimlik bilgilerini kullanarak süreci basitleştirebilirsiniz.

  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 nesnesini kullanın.

HTTP/REST

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

  1. Üstbilgi, hak talebi grubu ve imza içeren bir 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ın nasıl tamamlanacağı açıklanmaktadır.

Yanıt bir erişim jetonu içeriyorsa Google API'yi ç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 jetonu süresi dolduğunda uygulamanız başka bir JWT oluşturur, bu jetonu imzalar ve başka bir erişim jetonu ister.

Sunucu uygulamanız, Google Yetkilendirme Sunucusundan jeton istemek için bir JWT kullanır, ardından jetonu bir Google API uç noktasını çağırmak için kullanır. Son kullanıcının müdahalesi söz konusu 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 ayrıntıları açıklanmaktadır.

JWT oluşturma

JWT üç bölümden oluşur: başlık, hak talebi grubu ve imza. Başlık ve hak talebi grubu 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şı esneklik sağlar. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir.

JWT aşağıdaki şekilde oluşturulur:

{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ı, onaylamanın biçimini ve JWT'yi imzalamak için kullanılan [hizmet hesabı anahtarının anahtar kimliğini](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) gösteren üç alandan oluşur. Algoritma ve biçim zorunlu olup her alan yalnızca bir değere sahiptir. Ek algoritmalar ve biçimler kullanıma sunuldukça bu başlık buna uygun olarak değişecektir. Anahtar kimliği isteğe bağlıdır. Yanlış bir anahtar kimliği belirtilirse GCP, jetonu doğrulamak ve geçerli bir anahtar bulunmazsa jetonu reddetmek için hizmet hesabıyla ilişkili tüm anahtarları dener. Google, gelecekte yanlış anahtar kimliklerine sahip jetonları reddetme hakkını saklı tutar.

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

{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}

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

          eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
JWT hak talebi grubunu oluşturma

JWT hak talebi grubu; istenen izinler (kapsamlar), jetonun hedefi, kartı veren kuruluş, jetonun verilme zamanı ve jetonun ömrü dahil olmak üzere JWT hakkında bilgi içerir. Alanların çoğu zorunludur. JWT başlığı gibi JWT hak talebi grubu da bir 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örünebilir.

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 Onayın hedeflenen 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ı (01:00:00 UTC, 1 Ocak 1970). Bu değer, yayınlanma tarihinden sonra en fazla 1 saat içinde kullanılır.
iat Onayın gönderildiği zaman (01:00:00 UTC, 1 Ocak 1970).

JWT hak talebi grubundaki gerekli alanların JSON gösterimi 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 bir kuruluştaki belirli bir kullanıcı adına hareket etmek için alan genelinde yetkiyi kullanabilir. Bir uygulamanın kullanıcının kimliğine bürünebilmesi için bu tür kimliğe bürünme izinlerine sahip olunması gerekir ve genellikle bir süper yönetici tarafından gerçekleştirilir. Daha fazla bilgi için Alan genelinde yetki ile API erişimini kontrol etme bölümüne göz atın.

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

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

Uygulama, bir kullanıcının kimliğine bürünme iznine sahip değilse sub alanını içeren bir erişim jetonu isteğine verilen yanıt bir hata olur.

sub alanını içeren bir JWT hak talebi grubu örneği aşağıda 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 açısından güvenli şekilde kodlanmış olmalıdır. 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şturma mekanizmasına yön veren 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ı kullanan RSA'dır. Bu, JWT başlığındaki alg alanında RS256 olarak ifade edilir.

Google API Consoleişlevinden alınan özel anahtarla SHA256withRSA (SHA-256 karma işleviyle RSASSA-PKCS1-V1_5-SIGN olarak da bilinir) girişinin UTF-8 temsilini imzalayın. Çıkış bir bayt dizisi olacaktır.

İmza, Base64url olarak kodlanmış olmalıdır. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir. Sonuç, JWT'dir. Şöyle olmalıdır (daha net olması için satır sonları eklenmiştir):

{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]

İmzalanmış ve iletilmeye hazır bir JWT örneğini aşağıda bulabilirsiniz:

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

Erişim jetonu isteğinde bulunma

İmzalanmış JWT'yi oluşturduktan sonra bir uygulama, bu kodu kullanarak erişim jetonu isteyebilir. Bu erişim jetonu isteği bir HTTPS POST isteğidir ve gövde URL kodlamalıdır. 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 kodlaması şu şekildedir: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion İmza da dahil olmak üzere JWT.

Bir erişim jetonu isteğinde kullanılan HTTPS POST isteğinin ham dökümü aşağıda 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

Aynı istek, curl kullanılarak aşağıda belirtilmiştir:

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şturulmuşsa ve hizmet hesabının işlemi gerçekleştirme izni varsa Yetkilendirme Sunucusu'ndan 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ğeri tarafından 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-example-123 projesindeki 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 yetkilendirilmiş Credentials nesnesini kullanın:

  1. Çağrık istediğiniz API için bir hizmet nesnesi oluşturun. build işlevini API'nin adı ve sürümüyle ve 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-example-123 projesindeki Cloud SQL veritabanlarının örneklerini listelemek için:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

Uygulamanız bir erişim jetonu aldıktan sonra, API'nin gerektirdiği erişim izinlerinin verildiği belirli bir hizmet hesabı veya kullanıcı hesabı adına bir Google API'sine çağrı yapmak için bu jetonu kullanabilirsiniz. Bunun için erişim jetonunu access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API isteğine ekleyin. Mümkün olduğunda HTTP üst bilgisi, sorgu dizeleri sunucu günlüklerinde görünür olduğu için 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 bilgisini kullanarak drive.files uç noktasına (Drive Files API) yapılan ç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

access_token sorgu dizesi parametresini kullanarak kimliği doğrulanmış kullanıcının aynı API'ye yaptığı ç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 (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. Bir erişim jetonunun süresi sona erdiğinde, uygulama başka bir JWT oluşturmalı, bunu 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ı alanının Yönetici Konsolu'nda yetkilendirilmemiştir.

Yönetici Konsolu'nun Alan genelinde yetki sayfasında hizmet hesabının sub hak talebinde (alanda) kullanıcı için 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'nda istemci 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 Yönetici Konsolu'nda istenen bir veya daha fazla kapsam yetkilendirilmez.

Yönetici hesabının Alan genelinde yetki sayfasında (sub hak talebinde (alan)) hizmet hesabının yetkilendirildiğinden ve bu hesabın, JWT talebinizde scope isteğinde 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ğiyle ilgili daha fazla bilgi için Google Workspace verilerine hangi üçüncü taraf uygulamalar ve dahili uygulamaların erişebileceğini yönetme başlıklı Google Workspace Yöneticisi yardım makalesine bakı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 yapılandırıldığından ve doğru e-posta adresini kullandığınızdan emin olun.

JWT jetonunun doğru olduğundan ve istekte istemci kimliği için yayınlandığından emin olun.

invalid_grant Not a valid email. Kullanıcı mevcut değil. sub hak talebinde (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. exp değeri, gelecekte iat değerinden 65 dakikadan uzun olduğunda veya exp değeri iat değerinden düşük olduğunda da gerçekleşebilir.

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 bir özel anahtarla imzalanmış veya kullanılan anahtar silinmiş, devre dışı bırakılmış veya süresi dolmuş.

Alternatif olarak, JWT onayı yanlış kodlanmış olabilir. Yeni satırlar veya dolgu eşit işaretleri olmadan Base64 olarak kodlanması gerekir.

JWT hak talebi grubunun kodunu çözerek onayı imzalayan anahtarı hizmet hesabıyla ilişkilendirin.

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 ve içerdiği kapsamları, kullanmak istediğiniz API'ler için belgelenen kapsamlarla karşılaştırarak hata veya yazım hatası olmadığından emin olun.

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 Consoleadresine gidin ve 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şunda Google hesaplarına erişimi sınırlayan bir projenin parçasıdır.

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

Ek: OAuth olmadan hizmet hesabı yetkilendirmesi

Bazı Google API'leriyle, OAuth 2.0 erişim jetonu yerine, imzalı bir JWT'yi doğrudan hamiline ait jeton olarak 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 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 adresinde bulunan kitaplık) 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 ve exp alanı için JWT'nin süresinin dolacağı tam olarak 3.600 saniye sonrasını belirtin.

Hizmet hesabı JSON dosyanızda bulunan özel anahtarı kullanarak JSAT'ı 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. İmzalayan JWT'yi hamiline ait jeton olarak kullanarak API'yi çağırın:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com