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 dokümanlarındaki Kimlik Doğrulamaya Genel Bakış bölümüne bakın.

Google OAuth 2.0 sistemi, bir web uygulaması ve bir Google hizmeti arasındaki etkileşim gibi sunucular arası etkileşimleri destekler. Bu senaryoda hizmet hesabına ihtiyacınız vardır. Bu hesap, bireysel son kullanıcı yerine uygulamanıza ait bir hesaptır. Uygulamanız Google API'lerini hizmet hesabı adına arar, böylece kullanıcılar doğrudan katkıda bulunmaz. Bu senaryoya bazen "iki aşamalı OAuth", "2 LO" veya "2 LO" denir. (İlgili üç aşamalı OAuth, uygulamanızın son kullanıcılar adına Google API'lerini çağırdığı ve bazen kullanıcı rızasının gerekli olduğu senaryoları ifade eder.)

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ır.

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

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

Genel bakış

Sunucudan sunucuya etkileşimleri desteklemek için 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ı 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

Bir hizmet hesabının kimlik bilgileri, benzersiz ve oluşturulmuş en az bir ortak/özel anahtar çifti içeren e-posta adresi içerir. Alan genelinde yetki etkinleştirilirse bir müşteri kimliği, hizmet hesabı kimlik bilgilerinin de bir parçası 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 bir örnek hazırlama bölümüne bakın.

Uygulamanız Google App Engine veya Google Compute Engine'de çalışmıyorsa üzerinde bu kimlik bilgilerini almanız gerekir. Hizmet hesabı kimlik bilgilerini oluşturmak veya daha önce 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 istediğiniz zaman API Console'e dönebilirsiniz. API Console'nda hizmet hesabı kimlik bilgileri hakkında daha ayrıntılı bilgi için API Consoleyardım dosyasındaki Hizmet hesapları'na 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ı kullanır. Bir hizmet hesabının, alandaki kullanıcılar adına verilere erişmesi için yetkilendirme, bazen bir hizmet hesabı için "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ı tamamlaması gerekir:

  1. Google Workspace alanınızın Yönetici konsolunda 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 pageadresinde 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şmesi gerekiyorsa https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar adresini girin.
  6. Yetkilendir'i tıklayın.

Artık uygulamanız, alan adınızdaki kullanıcılar olarak API çağrısı yapma ("kullanıcıların kimliğine bürünme") yetkilidir. Yetkili API çağrıları yapmaya hazır olduğunuzda kullanıcının kimliğine bürüneceğini siz belirtirsiniz.

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

Java

İstemci e-posta adresini ve özel anahtarı API Consolekaynağından aldıktan sonra Java için Google API'leri İstemci Kitaplığı'nı kullanarak hizmet hesabının kimlik bilgilerinden ve uygulamanızın erişmesi gereken kapsamlardan bir GoogleCredential nesnesi oluşturabilirsiniz. Ö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 uygulama geliştiriyorsanız süreci basitleştirmek için uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz.

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

İstemci e-posta adresini ve özel anahtarı API Consolekaynağından edindikten 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 uygulama geliştiriyorsanız süreci basitleştirmek için uygulamanın varsayılan kimlik bilgilerini kullanabilirsiniz.

  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 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, telaffuz edilir &jot&quot); oluşturun.
  2. Google OAuth 2.0 Yetkilendirme Sunucusundan bir erişim jetonu isteyin.
  3. Yetkilendirme Sunucusu'nun döndürdüğü JSON yanıtını yönetin.

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

Yanıt bir erişim jetonu içeriyorsa erişim jetonunu Google API'yi çağırmak için kullanabilirsiniz. (Yanıt bir erişim jetonu içermiyorsa, JWT ve jeton isteğiniz düzgün ş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 imzayı 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 bu jetonu bir Google API uç noktasını çağırmak için 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 bayta serileştirilir ve daha sonra Base64url kodlaması kullanılarak kodlanır. Bu kodlama, tekrarlanan kodlama işlemleri nedeniyle kodlama değişikliklerine karşı dayanıklıdır. 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 aşağıdaki gibidir:

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

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

Hizmet hesapları, RSA SHA-256 algoritmasını ve JWT jetonu biçimini kullanır. Sonuç olarak, başlığın 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, jetonu verenin saati, jetonun verildiği zaman ve jetonun kullanım ömrü dahil olmak üzere JWT hakkında bilgi içerir. Alanların çoğu zorunludur. JWT üst bilgisi 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österilmiştir. 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 İddianın hedeflenen hedefinin tanımlayıcısıdır. Erişim jetonu isteğinde bulunurken bu değer her zaman https://oauth2.googleapis.com/token olur.
exp Onaylamanın son kullanma zamanı (1 Ocak 1970, 00:00:00 UTC) tarihinden itibaren saniye cinsinden belirtilir. Bu değer, verildikten sonra en fazla 1 saat olabilir.
iat 1 Ocak 1970'ten beri (00:00:00 UTC) belirtilen saniye cinsinden onay.

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, bir uygulama kuruluştaki belirli bir kullanıcı adına hareket etmek için alan genelinde yetki kullanabilir. Bir uygulamanın kullanıcının kimliğine bürünebilmesi için bu kimliğe bürünme türünün gerçekleştirilmesine izin verilmesi gerekir. Genellikle bu süper yönetici tarafından yönetilir. Daha fazla bilgi için Alan genelinde yetki ile API erişimini kontrol etme başlıklı makaleye bakın.

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

Ad Açıklama
sub Uygulamanın yetki verilen erişim isteğinde bulunduğu 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 ö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 grubunu kodlama

JWT başlığı gibi, JWT hak talebi grubu da UTF-8 ve Base64url için güvenli bir şekilde serileştirilmelidir. Bir JWT Hak Talebi grubunun JSON temsili örneğini aşağıda bulabilirsiniz:

{
  "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 mekaniğine 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ı kullanılarak RSA'dır. Bu, JWT başlığında bulunan alg alanında RS256 olarak ifade edilir.

Google API Consolenesnesinden alınan özel anahtarla SHA256withRSA (SHA-256 karma işleviyle RSASSA-PKCS1-V1_5-SIGN olarak da bilinir) girişini UTF-8 olarak 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ç JJT'dir. Bu değer (açıklamanın net olması için satır sonu eklendi) olmalıdır:

{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 iletilmeye hazır 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şturan bir uygulama, erişim jetonu istemek için bu kodu kullanabilir. Bu erişim jetonu isteği bir HTTPS POST isteğidir ve gövde URL olarak kodlanı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ış) kullanın: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion İmza da dahil olmak üzere JWT.

Aşağıda, bir 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ğıda aynı isteği (curl) kullanarak görebilirsiniz:

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ı ele alma

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 Sunucusu'ndan 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 ile belirtilen süre boyunca tekrar 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 nesnesini, 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-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 yetkili Credentials nesnesini kullanın:

  1. Çağrık istediğiniz API için hizmet nesnesi oluşturun. API nesnesinin adını ve sürümünü 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-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 kapsamları verildiyse belirli bir hizmet hesabı veya kullanıcı hesabı adına Google API'ye çağrı yapmak için bu jetonu kullanabilirsiniz. Bunu yapmak için erişim isteğini bir access_token sorgu parametresi veya Authorization HTTP üst bilgisi Bearer değeri ekleyerek API isteğine ekleyin. Sorgu dizeleri sunucu günlüklerinde görünür olduğu 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 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ı için aynı API'ye yapılan bir aramayı 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 bilgisi seçeneğini kullanan bir örnek (tercih edilir):

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 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üre dolduktan sonra dolar. Bir erişim jetonunun süresi dolduğunda 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ı Nasıl giderilir?
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ı.

Hizmet hesabının, Yönetici konsolunda Alan adı genelinde yetki sayfasında yetkilendirildiğinden emin olun: sub talebinde (alan) kullanıcı için.

Genellikle birkaç dakika sürse de yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara uygulanması 24 saat 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. Bir hizmet hesabı, Yönetici konsolundaki istemci kimliği (sayısal) yerine müşteri e-posta adresi kullanılarak 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 Yönetici konsolunda, istenen bir veya daha fazla kapsam yetkilendirilmemiştir.

Hizmet hesabının, Yönetici konsolunda Alan adı genelinde yetki sayfasında (sub hak talebinde (alan) kullanıcı için yetkilendirilmiş olduğundan ve JWT scope isteğinizde 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 uygulanması 24 saat kadar sürebilir.

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

Bu durum genellikle yerel sistem saatinin doğru olmadığı anlamına gelir. exp değeri iat değerinden 65 dakikadan uzunsa veya exp değeri iat değerinden düşükse de bu durum yaşanabilir.

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-posta adresi tarafından 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ır veya dolgu eşit işareti olmadan Base64 olarak kodlanması gerekir.

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 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 mevcut değil (yani geçersiz).

JWT ile ilgili scope hak talebinin (alan) doldurulduğundan emin olun. Bu alanın içerdiği kapsamları, hata veya yazım yanlışı olmadığından emin olmak için 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ışıdır.

Google API Consolebölümüne gidin ve IAM ve 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 hamiline ait jeton olarak imzalı bir JWT kullanarak yetkilendirilmiş 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 kalmazsınız.

Aramak istediğiniz API'nin Google API GitHub deposunda yayınlanan bir hizmet tanımı varsa erişim jetonu yerine JWT kullanarak yetkilendirilmiş 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 aşağıdaki örnekte olduğu gibi bir başlık ve yük içeren 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
    }
    • 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ında, geçerli Unix saatini ve exp alanında, JWT'nin süresinin dolacağı tam 3.600 saniyeyi 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:

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