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 sitesi ve bir web sunucusu arasındaki etkileşim gibi ve Google hizmetini kullanabilirsiniz. Bu senaryo için, sizin açınızdan sona eren bir hizmet hesabına bireysel bir son kullanıcıya değil, uygulamanıza ait bir hesaptır. Sizin Uygulama, hizmet hesabı adına Google API'lerini çağırır. Dolayısıyla kullanıcılar dahil edilir. Bu senaryoya bazen "iki aşamalı OAuth" adı verilir. veya "2LO" gibi bir ifade kullanabilirsiniz. (İlgili terim, "üç aşamalı OAuth" uygulamanızın adına Google API'lerini çağırdığı senaryolardır ve bazen kullanıcı izninin gerekli olduğu işlemlerdir.)

Genellikle bir uygulama, çalışmak üzere Google API'lerini kullandığında bir hizmet hesabı kullanır kullanıcıya ait veriler yerine kendi verileri kullanılarak oluşturulabilir. Örneğin, Google Cloud Veri kalıcılığı için Datastore, Google Cloud Datastore API.

Google Workspace alan yöneticileri şunları da yapabilir: hizmet hesaplarına alan genelinde yetki ver Google'daki verileri saklamadığını unutmayın.

Bu belgede, bir uygulamanın sunucudan sunucuya OAuth 2.0 akışını; Google API'leri istemci kitaplığı (önerilir) veya HTTP kullanarak.

Genel Bakış

Sunucudan sunucuya etkileşimleri desteklemek amacıyla önce şu konumda projeniz için bir hizmet hesabı oluşturun: API Console. Şuradaki kullanıcılara ait kullanıcı verilerine erişmek istiyorsanız: Google Workspace hesabınızı açın, ardından hizmet hesabına alan genelinde erişim yetkisi verin.

Ardından, uygulamanız, hizmet hesabının kimlik bilgileri (OAuth 2.0 yetkilendirme sunucusundan erişim jetonu isteme)

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 en azından değer düzeyinde oluşturulmuş bir e-posta adresi içerir. bir ortak/özel anahtar çifti olmalıdır. Alan genelinde yetki etkinse istemci kimliği de kimlik bilgilerinden yararlanırız.

Uygulamanız Google App Engine üzerinde çalışıyorsa projenizi oluşturuyorsunuz.

Uygulamanız Google Compute Engine'de çalışıyorsa bir hizmet hesabı da oluşturulur siz de otomatik olarak oluşturacaksınız, ancak projenizin uygulamasının erişmesi gerekir. Daha fazla bkz. Hizmet hesaplarını kullanmak için örnek hazırlama.

Uygulamanız Google App Engine veya Google Compute Engine'de çalışmıyorsa Google API Consoleiçinde bu kimlik bilgilerini kullanabilirsiniz. Hizmet hesabı oluşturmak için kimlik bilgilerinizi veya daha önce oluşturduğunuz herkese açık kimlik bilgilerini görüntülemek için aşağıdakileri 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.

İsterseniz API Console e-posta adresini dilediğiniz zaman görüntüleyebilirsiniz. anahtar parmak izlerini ve diğer bilgileri kullanmak veya ek ortak/özel anahtar çiftleri oluşturmak için kullanılabilir. Örneğin, hizmet hesabı kimlik bilgileri hakkında daha fazla bilgiyi API Console, bkz. API Consolekapsamındaki hizmet hesapları yardım dosyası olarak.

Hizmet hesabının e-posta adresini not edin ve hizmet hesabının özel anahtarını saklayın dosyayı uygulamanızın erişebildiği bir konuma yerleştirin. Uygulamanızda bu bilgilerin doğru şekilde yetkilendirilmiş API çağrıları.

Hizmet hesabına alan genelinde yetki verme

Kuruluşun Workspace yöneticisi Google Workspace hesabı kullanarak bir Google Workspace alanındaki kullanıcılar adına Workspace kullanıcı verilerine erişmek için kullanılan bir uygulamadır. Örneğin, bir uygulamadaki tüm kullanıcıların takvimlerine etkinlik eklemek için Bir Google Workspace alanının, Google Calendar API'ye erişmek için bir hizmet hesabı kullanması temsil eder. Bir hizmet hesabına bir alandaki kullanıcılar adına verilere erişmesi için yetki vermek, "alan genelinde yetki verme" olarak da bilinir. bir hizmet hesabına bağlayabilirsiniz.

Bir hizmet hesabına alan genelinde yetki vermek için Google Workspace alanında aşağıdaki adımların tamamlanması gerekir:

  1. Google Workspace alanınıza ait Yönetici konsolunda Ana menü'ye gidin Güvenlik > Erişim ve veri denetimi > API Denetimleri.
  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. Daha fazla hizmet hesabınızın istemci kimliğini Service accounts page
  5. OAuth kapsamları (virgülle ayrılmış) alanına, içe aktaracağınız kapsamların listesini girin. uygulaması için erişim izni verilmesi gerekir. Örneğin, uygulamanız için alan genelinde bir alan gerekiyorsa Google Drive API ve Google Calendar API'ye tam erişim sahibi olduğunuzdan emin olmak için şunları girin: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  6. Yetkilendir'i tıklayın.

Uygulamanız artık Workspace alanınızda kullanıcı olarak API çağrıları yapma yetkisine sahiptir ( "başkasının kimliğini kullanmak" kullanıcılar). Yetki verilmiş bu API çağrılarını yapmaya hazırlanırken kullanıcının, başkasının kimliğini kullanabilir.

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

Java

Müşteri e-posta adresini ve özel anahtarı API Consoleiçin Java için Google API'leri istemci kitaplığı (hizmet hesabının kimlik bilgilerinden bir GoogleCredential nesnesi oluşturmak ve izin verilen kapsamları belirleyin. Ö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 uygulama varsayılan kimlik bilgileri bu da süreci basitleştirebilir.

Alan genelinde yetki ver

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

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

Yukarıdaki kod, createDelegated() işlevini çağırmak için GoogleCredential nesnesini kullanır yöntemidir. createDelegated() yönteminin bağımsız değişkeni Workspace hesabı. İstekte bulunan kodunuz, Google'ı çağırmak için bu kimlik bilgisini kullanır Hizmet hesabınızı kullanan API'ler.

Python

Müşteri e-posta adresini ve özel anahtarı API Consoleiçin Python için Google API'leri İstemci Kitaplığı aşağıdaki adımları tamamlayın:

  1. Hizmet hesabının kimlik bilgilerinden veCredentials kapsamları belirler. Örnek:
    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 uygulama varsayılan kimlik bilgileri bu da süreci basitleştirebilir.

  2. Alan genelinde yetki ver

    Hizmet hesabına alan genelinde erişim yetkisi verdiyseniz ve başka bir kullanıcı hesabının kimliğine bürünmek için mevcut bir kullanıcının with_subject yöntemini ServiceAccountCredentials nesne algılandı. Örneğin:

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

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

HTTP/REST

İstemci kimliğini ve özel anahtarı API Console, başvurunuzun aşağıdaki adımları tamamlaması gerekiyor: şu adımları uygulayın:

  1. Bir başlık, talep grubu ve veri içeren bir JSON Web Jetonu (JWT, ve imza.
  2. Google OAuth 2.0 Yetkilendirme Sunucusu'ndan bir erişim jetonu isteyin.
  3. Yetkilendirme Sunucusunun döndürdüğü JSON yanıtını işleme.

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 şunlar için kullanabilirsiniz: bir Google API'si çağırın. (Yanıt bir erişim içermiyorsa JWT ve jeton isteğiniz düzgün biçimlendirilmemiş olabilir veya hizmet hesabı, istenen kapsamlara erişme izni yoktur.)

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

Sunucu uygulamanız, Google'dan jeton istemek için bir JWT kullanır
                  Ardından, jetonu kullanarak bir Google API uç noktası çağırır. Sıra No:
                  projeye dahil oluyor.

Bu bölümün geri kalanında, JWT oluşturma, JWT'yi imzalama, ve yanıtı işleme aldığınızdan emin olun.

JWT oluşturma

JWT üç bölümden oluşur: başlık, hak talebi grubu ve imzası var. Başlık ve talep kümesi JSON nesneleridir. Bu JSON nesneleri, UTF-8 baytları (daha sonra Base64url kodlaması kullanılarak kodlanır). Bu kodlama, korumanın kodlama değişikliklerine karşı koruma sağlar. Başlık, hak talebi grubu ve imza, nokta (.) karakteriyle birleştirilir.

JWT aşağıdaki gibi 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

Başlık, imzalama algoritmasını gösteren üç alandan oluşur: onay ve [hizmet hesabının anahtar kimliği key](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) kullanılan e-posta adresi. Algoritma ve biçim zorunludur ve her alanda yalnızca tek değer. Yeni algoritmalar ve biçimler kullanıma sunuldukça bu başlık değişir buna göre hazırlar. Anahtar kimliği isteğe bağlıdır. Yanlış bir Anahtar Kimliği belirtilirse GCP, jetonu doğrulamak ve aşağıdaki durumlarda jetonu reddetmek için hizmet hesabıyla ilişkili tüm anahtarlara geçerli anahtar bulunamadı. Google, yanlış anahtar kimliklerine sahip jetonları reddetme hakkını saklı tutar daha avantajlı bir konumda olursunuz.

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, JWT hakkında şu bilgileri içerir: istenen (kapsamlar), jetonun hedefi, kartı veren kuruluş, jetonun oluşturulduğu saat, çok önemlidir. Alanların çoğu zorunludur. JWT başlığı gibi, JWT talebi kümesi 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. Bu makaleler, emin olmanız gerekir.

Ad Açıklama
iss Hizmet hesabının e-posta adresi.
scope Uygulamanın istediği izinlerin boşlukla ayrılmış listesi.
aud Onaylamanın hedeflenen hedefinin tanımlayıcısı. Erişim jetonu oluştururken bu değerin her zaman https://oauth2.googleapis.com/token olmasını isteyebilirsiniz.
exp Onaylamanın geçerlilik bitiş zamanı (00:00:00 UTC itibarıyla saniye cinsinden belirtilir). 1 Ocak 1970. Bu değer, belirtilen zamandan en fazla 1 saat sonra olabilir.
iat Onaylamanın yayınlandığı saat (00:00:00 UTC itibarıyla saniye olarak belirtilir). 1 Ocak 1970.

JWT talebi kümesindeki 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 kendi adına işlem yapmak için alan genelinde yetkiyi kullanabilir kuruluştaki belirli bir kullanıcı için geçerlidir. Bu tür kimliğe bürünme işlemini gerçekleştirme izni bir uygulamanın bir kullanıcının kimliğine bürünebilmesi için önce verilmelidir ve genellikle süper yönetici. Daha fazla bilgi için bkz. Alan genelinde yetkiyle API erişimini kontrol edin.

Bir uygulamaya bir kaynağa erişim yetkisi veren bir erişim jetonu almak için: sub alanı boş bırakılamaz.

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

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

sub alanını içeren bir JWT hak talebi grubu örneği gösterilmiştir aşağıda bulabilirsiniz:

{
  "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 grubunun kodlanması

JWT başlığında olduğu gibi, JWT hak talebi grubu da UTF-8 ve Base64url-safe olarak serileştirilmelidir. kodlanmıştır. Aşağıda, bir JWT Hak Talebi grubunun JSON gösterimi ö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), web sitesi için imzayı oluşturma mekanizmasına rehberlik eden JWT. İmza 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. İlgili içeriği oluşturmak için kullanılan yalnızca Google OAuth 2.0 Yetkilendirme Sunucusu tarafından desteklenen imzalama algoritması, RSA'dır. SHA-256 karma oluşturma algoritması. Bu, alg içinde RS256 olarak ifade edilir alanına girin.

Girişin UTF-8 temsilini, SHA256withRSA (diğer adıyla SHA-256 karma işleviyle RSASSA-PKCS1-V1_5-SIGN) ve Google API Console. Çıkış, bir bayt dizisi olur.

Bu durumda imza, Base64url olarak kodlanmış olmalıdır. Başlık, hak talebi grubu ve imza nokta (.) karakteriyle birleştiriliyor. Sonuç, JWT'dir. Google aşağıdaki gibi olmalıdır (daha anlaşılır olması 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 bulunmaktadır:

{"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şturduktan sonra, uygulama bunu kullanarak erişim jetonu isteyebilir. Bu erişim jetonu isteği bir HTTPS POST isteğidir ve gövde URL'dir 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 Gerektiği şekilde URL olarak kodlanmış aşağıdaki dizeyi kullanın: urn:ietf:params:oauth:grant-type:jwt-bearer.
assertion İmza dahil JWT.

Aşağıda, erişim jetonunda kullanılan HTTPS POST isteğinin ham dökümünü görebilirsiniz istek:

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, curl kullanılarak aynı istek gösterilmektedir:

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ında işlemi gerçekleştirme izninin olması, ardından Yetkilendirme Sunucusu'nun JSON yanıtının 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ğer.

Google API'lerini çağırma

Java

Şu adımları uygulayarak Google API'lerini çağırmak için GoogleCredential nesnesini kullanın: şu adımları uygulayın:

  1. GoogleCredential nesne algılandı. Örneğin:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. API hizmetine istekte bulunmak için hizmet nesnesi tarafından sağlanan arayüz. Örneğin, heyecan verici-example-123 dizininde Cloud SQL veritabanlarının proje:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();
    .

Python

Aşağıdaki adımları uygulayarak Google API'lerini çağırmak için yetkilendirilmiş Credentials nesnesini kullanın: şu adımları uygulayın:

  1. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Bir hizmet nesnesi derlersiniz API'nin ve API'nin adı ve sürümüyle birlikte build işlevini çağırarak Credentials nesne yetkilendirildi. Örneğin, Cloud SQL Yönetimi API'si:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
    .
  2. API hizmetine istekte bulunmak için hizmet nesnesi tarafından sağlanan arayüz. Örneğin, heyecan verici-example-123 dizininde Cloud SQL veritabanlarının proje:
    response = sqladmin.instances().list(project='exciting-example-123').execute()
    .

HTTP/REST

Uygulamanız bir erişim jetonu aldıktan sonra, bu jetonu kullanarak bir Google Belirli bir hizmet hesabı adına API veya kullanıcı hesabı(API'nin gerektirdiği erişim kapsamları verildiyse) ile birlikte çalışır. Bunu yapmak için API'ye yapılan bir istekte, access_token sorgusu ekleyerek erişim jetonunu parametresi veya Authorization HTTP başlığı Bearer değeri olabilir. Mümkünse HTTP üstbilgisi tercih edilir, çünkü sorgu dizeleri sunucu günlüklerinde görünür olma eğilimindedir. Çoğu zaman Google API'lerine yapılan çağrılarınızı ayarlamak için bir istemci kitaplığı kullanabilirsiniz (örneğin, Drive Files API'yi çağırma).

Tüm Google API'lerini deneyebilir ve kapsamlarını şuradan görüntüleyebilirsiniz: OAuth 2.0 Playground (OAuth 2.0 Oyun Alanı).

HTTP GET örnekleri

Bir drive.files Authorization: Bearer HTTP kullanan uç nokta (Drive Files API) başlık 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 aynı API'ye access_token kullanılarak yapılan bir çağrı verilmiştir. sorgu dizesi parametresi:

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

curl örnek

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

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

Alternatif olarak, sorgu dizesi parametre seçeneği şu şekildedir:

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

Erişim jetonlarının süresinin dolacağı zaman

Google OAuth 2.0 Yetkilendirme Sunucusu tarafından verilen erişim jetonlarının geçerlilik süresi şu tarihten sonra dolar: expires_in değeri tarafından sağlanır. Bir erişim jetonunun süresi dolduğunda başka bir JWT oluşturması, imzalaması ve başka bir erişim jetonu istemesi gerekir.

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.

Hizmet hesabının Kullanıcıya ait Yönetici Konsolu'nun alan genelinde yetki sayfasını, sub hak talebi (alan).

Yetkilendirmenin tamamlanması genellikle birkaç dakika sürse de 24 saati bulabilir. Google Hesabınızdaki tüm kullanıcılara uygulanır.

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ı, istemci kimliği yerine istemci e-posta adresi kullanılarak yetkilendirildi (sayısal) olarak ayarlayın. Yönetici Konsolu'nda, alan genelinde yetki sayfasına giderek istemciyi kaldırıp yeniden ekleyin yerine sayısal kimlik kullanın.
access_denied (herhangi bir değer) Alan genelinde yetki kullanıyorsanız istenen kapsamlardan bir veya daha fazlası yetkilendirilmemiş Yönetici konsolu'nda oturum açın.

Hizmet hesabının Kullanıcıya ait Yönetici Konsolu'nun alan genelinde yetki sayfasını, sub hak talebi (alan) ve istediğiniz tüm kapsamları içerdiğinden emin olun. JWT'nizin scope hak talebinde bulunun.

Yetkilendirmenin tamamlanması genellikle birkaç dakika sürse de 24 saati bulabilir. Google Hesabınızdaki tüm kullanıcılara uygulanır.

admin_policy_enforced (herhangi bir değer) Google Hesabı, politikalarına uymak zorundadır.

Google Workspace Yöneticisi yardım makalesine göz atın Hangi üçüncü taraf ve nasıl yararlanabileceğiniz hakkında daha fazla bilgi için yönetici, şu zamana kadar tüm kapsamlara veya hassas ve kısıtlanmış kapsamlara erişimi kısıtlayabilir. OAuth istemci kimliğinize açıkça erişim verildi.

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 talepleri içerdiğinden emin olun.

OAuth istemcisi ve hizmet hesabının doğru olduğundan emin olun: doğru e-posta adresini kullandığınızdan emin olun.

JWT jetonunun doğru olduğundan ve isteğinde bulunabilirsiniz.

invalid_grant Not a valid email. Kullanıcı mevcut değil. sub hak talebi alanındaki (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. Ayrıca yalnızca exp değeri, gelecekte iat değeri için 65 dakikadan uzun bir süre sonra veya exp değeri iat değerinden küçük.

JWT'nin oluşturulduğu sistemdeki saatin doğru olduğundan emin olun. Eğer zamanınızı proje yönetimiyle ilgili Google NTP.

invalid_grant Invalid JWT Signature.

JWT onayı, hizmet hesabıyla ilişkili olmayan bir özel anahtarla imzalanmış kullanılan anahtarın silinmiş, devre dışı bırakılmış veya süresi doldu.

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

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

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

invalid_scope Invalid OAuth scope or ID token audience provided. Hiçbir kapsam istenmedi (kapsamların boş listesi) veya istenen kapsamlardan biri istenmedi (yani geçersizdir).

JWT'ye ait scope hak talebinin (alanının) doldurulduğundan emin olun ve kapsamlarla birlikte kullanmak istediğiniz API'lerin kapsamlarını emin olun.

scope hak talebindeki kapsamların listesinin boşluk kullanmayın.

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

Google API Consolebölümüne gidin ve IAM ve Yönetici Konsolu > Hizmet Hesapları'nı seçerseniz "Anahtar Kimliği"ni içeren hizmet hesabını etkinleştirin. ikinci el ifadesini kullanın.

org_internal This client is restricted to users within its organization. İstekteki OAuth istemci kimliği, Google'a erişimi sınırlayan bir projenin parçası Belirli bir Google Cloud Kuruluşu.

Kimlik doğrulaması için kuruluşa ait bir hizmet hesabı kullanın. Şunu onaylayın: kullanıcı türü yapılandırma kullanıyorsanız daha fazla bilgi edinin.

Ek: OAuth olmadan hizmet hesabı yetkilendirme

Bazı Google API'leriyle, imzalı bir JWT kullanarak doğrudan OAuth 2.0 erişim jetonu yerine hamiline ait jetondur. Bu mümkün olduğunda, projenizi API çağrısı yapmadan önce Google'ın yetkilendirme sunucusuna bir ağ isteği gönderin.

Çağırmak istediğiniz API'nin Google API'leri GitHub deposu, 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. Şunları yaptığınızdan emin olun: hesabı oluşturduğunuzda aldığınız JSON dosyasını saklayın.
  2. Şu adreste bulunan gibi standart bir JWT kitaplığını kullanmak: jwt.io, başlık içeren bir JWT oluşturun ve yük aşağıdaki örnekteki gibidir:
    {
      "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ını belirtin Kimlik. Bu değeri, hizmet hesabınızın private_key_id alanında bulabilirsiniz. JSON dosyası.
    • iss ve sub alanları için hizmet hesabınızın e-posta adresini belirtin girin. Bu değeri, hizmetinizin client_email alanında bulabilirsiniz. account JSON dosyası.
    • aud alanı için API uç noktasını belirtin. Örnek: https://SERVICE.googleapis.com/
    • iat alanı için geçerli Unix saatini belirtin ve exp alanında, JWT'nin zamanla tam olarak 3.600 saniye sonra sona erecektir.

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

Örneğin:

Java

Kullanım 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'yi 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. Hamiline ait 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
    .

Hesaplar Arası Korumayı Uygulama

Kullanıcılarınızın güvenliğini korumak için atmanız gereken ek bir adım Hesaplar Arası Google'ın Hesaplar Arası Koruma Hizmeti'ni kullanarak koruma. Bu hizmet sayesinde şunları yapabilirsiniz: uygulamanıza aşağıdaki konularda bilgi sağlayan güvenlik işlemi bildirimlerine abone olun: kullanıcı hesabında önemli değişiklikler yapabilir. Daha sonra bu bilgileri kullanarak karar verdiğinizden emin olun.

Google'ın Hesaplar Arası Koruma Hizmeti tarafından uygulamanıza gönderilen etkinlik türlerine örnek olarak aşağıdakiler verilebilir:

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

Bkz. Kullanıcı hesaplarını Hesaplar Arası Koruma ile koruma 'nı inceleyin. inceleyin.