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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.
Daha fazla bilgi için Google Cloud Platform dokümanlarındaki Kimlik Doğrulamaya Genel Bakış bölümüne bakın.

Google OAuth 2.0 sistemi, bir web uygulaması ile Google hizmeti arasındaki etkileşim gibi sunucular arası etkileşimleri destekler. Bu senaryoda hizmet hesabına ihtiyacınız vardır. 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 dahil olmaz. Bu senaryoya bazen "iki aşamalı OAuth" veya "2LO" denir. (İlgili üç terimli OAuth terimi, uygulamanızın son kullanıcılar adına Google API'lerini çağırdığı ve bazen kullanıcı izninin gerektiği senaryolarla ilgilidir.)

Genelde uygulama, kullanıcı 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 yapılan çağrıların kimliğini doğrulamak için bir hizmet hesabı kullanıyor olacak.

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

Bu dokümanda, bir 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şimi 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ı genelinde alan adı 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ı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 ve oluşturulmuş en az bir ortak/özel anahtar çiftiyle oluşturulmuş bir e-posta adresi içerir. Alan genelinde yetki etkinleştirilirse hizmet hesabının kimlik bilgilerinin bir parçası da istemci kimliği olur.

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 bir Google Compute Engine örneği oluşturduğunuzda, uygulamanızın erişmesi gereken kapsamları belirtmeniz gerekir. Daha fazla bilgi için Hizmet hesaplarını kullanmak için örneği hazırlama başlıklı makaleye 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 bilgilerini oluşturmak veya önceden oluşturduğunuz herkese açık kimlik bilgilerini görüntülemek için aşağıdakileri yapın:

İlk önce bir hizmet hesabı oluşturun:

  1. Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Click hizmet hesabı oluşturun.
  4. Servis hesap ayrıntıları altında, hizmet hesabı için bir ad, kimlik ve açıklama yazın, ardından oluşturun ve devam tıklayın.
  5. Opsiyonel: Altında Hibe projesine bu hizmet hesabı erişim, hizmet hesabına vermek için IAM rolleri seçin.
  6. Devam tıklayın.
  7. İsteğe bağlı: Bu hizmet hesabına Altında Grant kullanıcıları erişim, kullanımı ve hizmet hesabı yönetmek için izin verilen kullanıcı veya grupları ekleyin.
  8. Bitti tıklayın.
  9. Click anahtarı oluşturun ve ardından Oluştur'u tıklayın.

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

  1. Oluşturduğunuz hizmet hesabının e-posta adresini tıklayın.
  2. Tuşlar sekmesini tıklayın.
  3. Ekleme anahtar açılır listesinde, yeni bir anahtar oluşturun seçin.
  4. Oluştur 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 ek ortak/özel anahtar çiftleri oluşturmak için dilediğiniz zaman API Console simgesine dönebilirsiniz. API Consolehizmet hesabındaki hizmet hesabı kimlik bilgileri hakkında daha fazla bilgi edinmek 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ın yetkili API çağrıları yapabilmesi için bunlara ihtiyacı vardır.

Hizmet hesabı için alan genelinde yetki verme

Google Workspace hesabınız varsa kuruluşun bir yöneticisi, bir uygulamayı Google Workspace alanındaki kullanıcılar adına kullanıcı verilerine erişmesi için yetkilendirebilir. Örneğin, bir Google Workspace alanındaki tüm kullanıcıların takvimlerine etkinlik eklemek için Google Calendar API kullanan bir uygulama, kullanıcılar adına Google Calendar API'ye erişmek için bir hizmet hesabı kullanacaktır. Bir hizmet hesabına alan adındaki kullanıcılar adına verilere erişim yetkisi verme bazen hizmet hesabına "alan adı 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ı tamamlaması gerekir:

  1. Google Workspace alan adınızın Yönetici konsolunda Ana menü > Güvenlik > Erişim ve veri kontrolü > 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. Client ID (İstemci Kimliği) alanına hizmet hesabının Client ID (İstemci Kimliği) değerini girin. Hizmet hesabınızın istemci kimliğini Service accounts pageadresinde bulabilirsiniz.
  5. OAuth kapsamları (virgülle ayrılmış) alanına, uygulamanızın erişmesi gereken izin kapsamlarını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'de çağrı yapma yetkisine sahip ("kullanıcılar" kimliğini kullanma) yetkisine sahiptir. Yetkilendirilmiş API çağrıları yapmaya hazır olduğunuzda kullanıcının kimliğine bürüneceğini belirtirsiniz.

Yetkili bir API çağrısı yapmaya hazırlanma

Java

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

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 süreci basitleştirebilecek uygulama varsayılan kimlik bilgilerini kullanabilirsiniz.

Alan genelinde yetki verme

Hizmet hesabı için alan genelinde erişim yetkisi verdiyseniz ve bir kullanıcı hesabının kimliğine bürünmek istiyorsanız GoogleCredential nesnesinin createDelegated yöntemini kullanarak 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 Consoleadresinden 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 süreci basitleştirebilecek uygulama varsayılan kimlik bilgilerini kullanabilirsiniz.

  2. Alan genelinde yetki verme

    Hizmet hesabı için alan adı 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. Örnek:

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

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

HTTP/REST

API Consoleadresinden 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 Jetonu (JWT, telaffuzlu "&'t;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 doldurulacağı açıklanmaktadır.

Yanıt bir erişim jetonu içeriyorsa, erişim jetonunu Google API'sini çağırmak için kullanabilirsiniz. (Yanıt bir erişim jetonu içermiyorsa, JWT ve jeton isteğiniz doğru şekilde biçimlendirilmemiş olabilir veya hizmet hesabı, istenen kapsamlara erişim izni 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 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ılar dahil değildir.

Bu bölümün geri kalanında, JWT oluşturma, JWT'yi imzalama, erişim jetonu isteğini oluşturma ve yanıtı işleme ile ilgili 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 ve daha sonra Base64url kodlaması kullanılarak kodlanır. Bu kodlama, tekrarlanan kodlama işlemleri nedeniyle kodlama değişikliklerine dayanıklılık sağlar. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir.

JWT yapısı şu şekildedir:

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

İmzanın temel dizesi şöyledir:

{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ın da doldurulması zorunludur ve her alanın yalnızca bir değeri vardır. Başka algoritmalar ve biçimler eklendikçe bu başlık da buna göre değişir.

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

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

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

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT hak talebi grubu oluşturuluyor

JWT talep grubu, istenen izinler (kapsamlar), jetonun hedefi, kartı veren kuruluş, jetonun verildiği saat ve jetonun kullanım ömrü, JWT ile ilgili bilgileri 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, iddia kümesinde 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 süresi. 1 Ocak 1970'ten itibaren 00:00:00 UTC'den itibaren saniye cinsinden belirtilir. Bu değer, alındıktan sonra en fazla 1 saattir.
iat Onaylamanın yapıldığı saat, 1 Ocak 1970'ten itibaren 00:00:00 UTC'den itibaren saniye cinsinden belirtilir.

JWT hak talebi grubundaki gerekli 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ş genelindeki belirli bir kullanıcı adına işlem yapmak için alan genelinde yetkiyi kullanabilir. Bir uygulamanın, kullanıcının kimliğine bürünebilmesi için bu kimliğe bürünme işlemini gerçekleştirme izni 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.

Bir kaynağa kaynağa yetkilendirilmiş erişim veren bir 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 verme erişimi isteyen kullanıcının e-posta adresi.

Bir uygulamanın 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.

sub alanını içeren bir JWT hak talebi grubu ö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 hak talebi kümesini kodlama

JWT başlığı gibi, JWT hak talebi grubu da UTF-8 ve Base64url güvenli olarak 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
}
İmzayı hesaplama

JSON Web İmzası (JWS), JWT'nin imzasını oluşturma mekaniklerini yönlendiren 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 üstbilgisindeki alg alanında RS256 olarak ifade edilir.

Girişin UTF-8 gösterimini, Google API Consolekaynağından alınan özel anahtarla SHA256withRSA (SHA-256 karma işleviyle RSASSA-PKCS1-V1_5-SIGN olarak da bilinir) kullanarak imzalayın. Çıkış, 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ç JJT'dir. Aşağıdaki gibi olmalıdır (daha net satır sonları eklendi):

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

İmzalanmış JWT'yi oluşturduktan sonra bir uygulama, bu jetonu erişim jetonu istemek için kullanabilir. Bu erişim jetonu isteği bir HTTPS POST isteğidir ve gövde URL olarak kodlanmıştı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 (gerektiği şekilde URL olarak kodlanmıştır) kullanın: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion İmza dahil JWT.

Aşağıda, erişim jetonu isteğinde kullanılan HTTPS POST isteğinin işlenmemiş bir 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ğıdaki istek de curl ile aynıdı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 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 bir yanıt örneği 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. API için GoogleCredential nesnesini kullanarak çağırmak istediğiniz 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 yetkilendirilmiş Credentials nesnesini kullanın:

  1. Aramak istediğiniz API için bir hizmet nesnesi oluşturun. API işlevini ve yetkili Credentials nesnesini içeren build işlevini ç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 bir erişim jetonu aldıktan sonra, API tarafından gerekli erişim alanlarının sağlanması durumunda belirli bir hizmet hesabı veya kullanıcı hesabı adına bir Google API'ye çağrı yapmak için bu jetonu kullanabilirsiniz. Bunu yapmak için access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API'ye yapılan isteğe erişim jetonunu ekleyin. Sorgu dizeleri sunucu günlüklerinde görünür hale geldiği için mümkün olduğunda HTTP üstbilgisi 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 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

Aşağıda, kimliği doğrulanmış kullanıcı için access_token sorgu dizesi parametresini kullanarak aynı API'ye yönelik 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 üst bilgisi 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 parametresi seçeneği şu şekilde olabilir:

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 dolduktan sonra dolar. Bir 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ının, kullanıcının alanının Yönetici konsolunda yetkilendirilmemiş olması.

Yönetici Konsolu'nun Alan adı genelinde yetki sayfasında sub iddiasında (alanda) hizmet hesabının yetkilendirildiğinden emin olun.

Genellikle birkaç dakika sürse de yetkilendirmenin Google Hesabınızda 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 konsolunda istemci kimliği (sayısal) yerine müşteri e-posta adresi kullanılarak bir hizmet hesabı yetkilendirildi. Yönetici konsolundaki Alan adı genelinde yetkilendirme 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 yetkilendirilmemiştir.

Yönetici Konsolu'nun Alan adı genelinde yetki sayfasında hizmet için sub hak talebinde (alan) kullanıcıya hizmet hesabının yetki verildiğinden ve JWT'nin scope hak talebinde bulunduğunuz tüm kapsamların bulunduğundan emin olun.

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

invalid_grant Not a valid email. Kullanıcı mevcut değil. sub hak talebi (alanında) 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 durum, genellikle yerel sistem saatinin doğru olmadığını gösterir. exp değeri gelecekte iat değerinden 65 dakikadan uzun olduğunda veya exp değeri iat değerinden düşük olduğunda da meydana gelebilir.

Sistemde JWT'nin oluşturulduğu 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şkilendirilmemiş ö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 onaylamayı 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 bir OAuth kitaplığı kullanmayı deneyin.

invalid_scope Invalid OAuth scope or ID token audience provided. Kapsam istenmedi (kapsamların boş listesi) veya istenen kapsamlardan biri yok (yani geçersiz).

JWT'nin scope hak talebinin (alanının) doldurulduğundan emin olun. Hata veya yazım hatası olmadığından emin olmak için, içerdiği API'leri kullanmak istediğiniz API'ler için belirtilen kapsamlarla 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ışı bırakıldı.

Google API Consolebölümüne gidin ve IAM & Yönetici > Hizmet Hesapları bölümünde, onayı 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'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ği göndermek zorunda kalmamanız gerekir.

Aramak istediğiniz API'nin Google API GitHub deposunda yayınlanmış bir hizmet tanımı varsa erişim jetonu yerine 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ı koruduğunuzdan emin olun.
  2. Herhangi bir standart JWT kitaplığını (ör. jwt.io'da bulunan kitaplık) kullanarak bir 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ğinizi 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 3600 saniye sonrasını belirtin.

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

Örnek:

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