Sunucudan Sunucuya Uygulamalar için OAuth 2.0'ı Kullanma

Google OAuth 2.0 sistemi, bir web uygulaması ile bir Google hizmeti arasındakiler gibi sunucular arası etkileşimleri destekler. Bu senaryo için uygulamanıza yerine bir bireysel son kullanıcıya ait bir hesap olan bir hizmet hesabı gerekir. Uygulamanız, hizmet hesabı adına Google API'lerini çağırır, böylece kullanıcılar doğrudan dahil olmaz. Bu senaryoya bazen "iki aşamalı OAuth" veya "2LO" denir. (İlgili "üç aşamalı OAuth" terimi, uygulamanızın son kullanıcılar adına Google API'lerini çağırdığı ve bazen kullanıcı onayının gerekli olduğu senaryoları ifade eder.)

Bir uygulama, bir kullanıcının verileri yerine kendi verileriyle çalışmak için Google API'lerini kullandığında genellikle 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 yaptığı çağrıların kimliğini doğrulamak için bir hizmet hesabı kullanır.

Ayrıca, Google Çalışma Alanı alan yöneticileri hizmetini vermek alan çapında otorite hesapları etki alanındaki kullanıcılar adına erişim kullanıcı verilerine.

Bu belge, bir uygulamanın bir Google API istemci kitaplığı (önerilir) veya HTTP kullanarak sunucudan sunucuya OAuth 2.0 akışını nasıl tamamlayabileceğini açıklar.

genel bakış

Destek sunucu sunucuya etkileşimleri için, ilk projeniz için bir hizmet hesabı oluşturmak API Console. Google Workspace hesabınızdaki kullanıcılar için kullanıcı verilerine erişmek istiyorsanız, hizmet hesabına alan genelinde erişim yetkisi verin.

Ardından, uygulamanız, OAuth 2.0 kimlik doğrulama sunucusundan bir erişim belirteci istemek için hizmet hesabının kimlik bilgilerini kullanarak yetkili API çağrıları yapmaya hazırlanır.

Son olarak, uygulamanız Google API'lerini çağırmak için erişim belirtecini kullanabilir.

Hizmet hesabı oluşturma

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

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

Uygulamanız Google Compute Engine üzerinde çalışıyorsa, projenizi oluşturduğunuzda otomatik olarak bir hizmet hesabı da oluşturulur, ancak bir Google Compute Engine örneği oluşturduğunuzda uygulamanızın erişmesi gereken kapsamları belirtmeniz gerekir. Daha fazla bilgi için, bkz kullanım hizmet hesaplarına bir örneğini hazırlamak .

Başvurunuz Google App Engine veya Google Compute Engine çalışmaz ise, bu kimlik bilgilerini almalısınız Google API Console. Hizmet hesabı kimlik bilgilerini oluşturmak veya önceden oluşturduğunuz genel 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.

Sen dönebilirsiniz API Console e-posta adresi, açık anahtar parmak izi ve diğer bilgileri görüntülemek için veya ek kamu / özel anahtar çiftleri oluşturmak için herhangi bir zamanda. Hizmet hesabı kimlik hakkında daha ayrıntılı bilgi için API Console, bkz Hizmet hesapları içinde API Consoleyardım dosyası.

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

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

Bir Google Workspace hesabınız varsa, kuruluşun yöneticisi bir uygulamaya Google Workspace alanındaki kullanıcılar adına kullanıcı verilerine erişme yetkisi 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. Bir hizmet hesabını, bir etki alanındaki kullanıcılar adına verilere erişmesi için yetkilendirmek, bazen bir hizmet hesabına "etki alanı çapında yetki devretmek" olarak adlandırılır.

Bir hizmet hesabına alan genelinde yetki vermek için Google Workspace alanının bir süper yöneticisinin aşağıdaki adımları tamamlaması gerekir:

  1. Google Çalışma Alanı alanınızın itibaren Yönetici konsoluna , Ana menü gidin > Güvenlik> API Kontrolleri.
  2. Alan geniş heyeti bölmesinde, Alan Geniş Heyeti Yönet seçin.
  3. Tıklayın Yeni ekle.
  4. İstemci Kimliği alanında, hizmet hesabınızdaki Müşteri kimliğini girin. İçeri servis hesabının müşteri kimliğini bulabilirsiniz Service accounts page.
  5. OAuth kapsamları ise (virgülle ayrılmış) alanında, uygulama erişimi verilmesi gerektiğini kapsamları listesini girin. Örneğin, uygulama, Google Drive API ve Google Takvim API alan çapında tam erişim ihtiyacı varsa, girin: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / takvim.
  6. Yetkilendir'i tıklayın.

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

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

Java

Eğer istemci e-posta adresini ve özel anahtarı edindikten sonra API Consolekullanmak Java için Google API İstemci Kitaplığı bir oluşturmak için GoogleCredential hizmet hesabının kimlik nesneyi ve uygulamanızın erişmesi gerekiyor kapsamları. Ö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 Platformunda bir uygulama geliştiriyorsanız, kullanabileceğiniz uygulama varsayılan kimlik sürecini basitleştiren şekilde yerine.

Alan genelinde yetki devretme

Hizmet hesabına ilişkin alan çapında erişim yetkisi olan ve bir kullanıcı hesabı almasına isterseniz, kullanıcı hesabının e-posta adresini belirtmek createDelegated yöntemine GoogleCredential nesnesi. Örneğin:

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

Kullanım GoogleCredential uygulamanızda Google API'leri çağırmak için nesneyi.

piton

Eğer istemci e-posta adresini ve özel anahtarı edindikten sonra API Consolekullanmak Python için Google API'leri Müşteri Kitaplığı aşağıdaki adımları tamamlamak için:

  1. Bir oluşturma Credentials hizmet hesabın kimlik bilgileriyle nesneyi ve uygulamanızın erişmesi gerekiyor kapsamları. Ö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 Platformunda bir uygulama geliştiriyorsanız, kullanabileceğiniz uygulama varsayılan kimlik sürecini basitleştiren şekilde yerine.

  2. Alan genelinde yetki devretme

    Hizmet hesabına ilişkin alan çapında erişim yetkisi olan ve bir kullanıcı hesabı almasına istiyorsanız, kullanmak with_subject varolan yöntemini ServiceAccountCredentials nesne. Ö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/DİNLENME

Eğer istemci kimliği ve özel anahtarı edindikten sonra API Console, uygulamanız aşağıdaki adımları uygulaması gerekmektedir:

  1. Bir başlık, bir talep seti ve bir imza içeren bir JSON Web Simgesi (JWT, telaffuz edilir, "jot") oluşturun.
  2. Google OAuth 2.0 Yetkilendirme Sunucusundan bir erişim belirteci isteyin.
  3. Yetkilendirme Sunucusunun döndürdüğü JSON yanıtını işleyin.

İzleyen bölümlerde bu adımların nasıl tamamlanacağı açıklanmaktadır.

Yanıtı bir erişim belirteci içeriyorsa, için belirteç erişimini kullanabilir bir Google API çağrısı . (Yanıt bir erişim belirteci içermiyorsa, JWT ve belirteç isteğiniz uygun şekilde oluşturulmamış olabilir veya hizmet hesabının istenen kapsamlara erişim izni olmayabilir.)

Erişim belirteci zaman sona eriyor , uygulamanız başka JWT'yi, işaretler bunu oluşturur ve başka bir erişim belirteci ister.

Sunucu uygulamanız, Google Yetkilendirme Sunucusundan bir belirteç istemek için bir JWT kullanır, ardından bir Google API uç noktasını çağırmak için belirteci kullanır. Son kullanıcı dahil değildir.

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

JWT Oluşturma

Bir JWT üç bölümden oluşur: bir başlık, bir talep seti ve bir imza. Başlık ve talep seti, JSON nesneleridir. Bu JSON nesneleri UTF-8 bayt olarak serileştirilir, ardından Base64url kodlaması kullanılarak kodlanır. Bu kodlama, tekrarlanan kodlama işlemlerinden kaynaklanan kodlama değişikliklerine karşı esneklik sağlar. Başlık, istem grubu, ve imza bir süre (birlikte birleştirilir . ) Karakteri.

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

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

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

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

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

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

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

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

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT talep setini oluşturma

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

Gerekli talepler

JWT talep setinde gerekli olan talepler aşağıda gösterilmiştir. Talep kümesinde herhangi bir sırada görünebilirler.

İsim Açıklama
iss Hizmet hesabının e-posta adresi.
scope Uygulamanın istediği izinlerin boşlukla ayrılmış listesi.
aud İddianın amaçlanan hedefinin bir tanımlayıcısı. Bir erişim belirteci isteği yaparken bu değer her zaman https://oauth2.googleapis.com/token .
exp 1 Ocak 1970 00:00:00 UTC'den bu yana saniye olarak belirtilen iddianın sona erme süresi. Bu değer, yayımlanma zamanından sonra en fazla 1 saattir.
iat İddianın yayınlandığı saat, 1 Ocak 1970 00:00:00 UTC'den bu yana saniye olarak belirtilir.

Bir JWT talep kümesindeki zorunlu alanların JSON temsili aşağıda gösterilmiştir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
Ek talepler

Bazı kurumsal durumlarda, bir uygulama, bir kuruluştaki belirli bir kullanıcı adına hareket etmek için etki alanı çapında yetkilendirme kullanabilir. Bu tür kimliğe bürünme gerçekleştirme izni, bir uygulama bir kullanıcının kimliğine bürünmeden önce verilmelidir ve genellikle bir süper yönetici tarafından işlenir. Daha fazla bilgi için, bkz alan çapında heyetle Kontrol API erişimini .

Bir uygulama bir kaynağa erişim yetkisi bu hibe belirteç bir erişim elde etmek için, değeri olarak JWT'de İstemler setinde kullanıcının e-posta adresini içeren sub alanı.

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

Bir uygulama, bir kullanıcıyı içeren bir erişim belirteci talebe tepki taklit iznine sahip değilse sub alan bir olacak hata .

İçeren bir JWT'de İstemler setinde bir örneği, sub alan, aşağıda gösterilmiştir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWT talep setini kodlama

JWT başlığı gibi, JWT talep seti de UTF-8 ve Base64url-güvenli kodlanmış olarak serileştirilmelidir. Aşağıda, bir JWT Talep kümesinin JSON temsiline bir örnek verilmiştir:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
imzanın hesaplanması

JSON Web İmza (JWS) özelliğidir JWT'de için imza oluşturma rehberleri mekanik olduğu. İmza girişi, aşağıdaki içeriğin bayt dizisidir:

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

JWT başlığındaki imzalama algoritması, imza hesaplanırken kullanılmalıdır. Google OAuth 2.0 Yetkilendirme Sunucusu tarafından desteklenen tek imzalama algoritması, SHA-256 karma algoritmasını kullanan RSA'dır. Bu olarak ifade edilir RS256 içinde alg JWT'de başlığında alan.

Elde edilen özel anahtarı ile (aynı zamanda SHA-256 karma işlev ile RSASSA-PKCS1-V1_5-SIGN olarak da bilinir) SHA256withRSA kullanarak girdi UTF-8 temsil giriş Google API Console. Çıktı bir bayt dizisi olacaktır.

İmza daha sonra Base64url kodlu olmalıdır. Başlık, istem grubu, ve imza bir süre (birlikte birleştirilir . ) Karakteri. Sonuç JWT'dir. Aşağıdaki gibi olmalıdır (netlik için 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 iletilmeye hazır bir JWT örneği verilmiştir:

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

Erişim belirteci isteğinin yapılması

İmzalı JWT'yi oluşturduktan sonra, bir uygulama bunu bir erişim belirteci istemek için kullanabilir. İsteğe jetonu Bu erişim HTTPS olan POST isteği ve vücut URL kodlu olduğunu. URL aşağıda gösterilmiştir:

https://oauth2.googleapis.com/token

Aşağıdaki parametreler HTTPS gereklidir POST isteği:

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

Aşağıda HTTPS bir ham döküm olduğunu POST isteği belirteci bir erişimde kullanılan 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 kullanarak aynı istek vardır curl :

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şlemek

JWT ve erişim belirteci isteği uygun şekilde oluşturulmuşsa ve hizmet hesabının işlemi gerçekleştirme izni varsa, Yetkilendirme Sunucusu'ndan gelen JSON yanıtı bir erişim belirteci içerir. Aşağıdaki örnek bir yanıttır:

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

Erişim belirteçleri ile belirtilen süre penceresi sırasında yeniden kullanılabilir expires_in değeri.

Google API'lerini çağırma

Java

Kullanım GoogleCredential aşağıdaki adımları tamamlayarak Google API'leri çağırmak için nesneyi:

  1. Kullandığınız aramak istediğiniz API için bir hizmet nesnesi oluşturun GoogleCredential nesnesi. Örneğin:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. Kullanarak API hizmeti istekleri olun hizmet nesnesi tarafından sağlanan arayüz . : Örneğin, heyecan verici-ornek-123 projesi Cloud SQL veritabanları örneklerini listelemek için
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

piton

Yetkili kullanın Credentials aşağıdaki adımları tamamlayarak Google API'leri çağrı itiraz:

  1. Çağırmak istediğiniz API için bir hizmet nesnesi oluşturun. Sen arayarak aa hizmet nesnesi oluşturmak build adı ve API sürümü ve yetkili ile işlevini Credentials nesne. Örneğin, Cloud SQL İdaresi API sürümü 1beta3 çağırmak için:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. Kullanarak API hizmeti istekleri olun hizmet nesnesi tarafından sağlanan arayüz . : Örneğin, heyecan verici-ornek-123 projesi Cloud SQL veritabanları örneklerini listelemek için
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/DİNLENME

Uygulamanız bir erişim belirteci aldıktan sonra, API'nin gerektirdiği erişim kapsamı/kapsamları verilmişse, belirli bir hizmet hesabı veya kullanıcı hesabı adına bir Google API'sine çağrı yapmak için belirteci kullanabilirsiniz. Bunu yapmak için, bir ya da içerecek şekilde API için bir istek olarak belirteci erişimi bulunmaktadır access_token sorgu parametresini veya Authorization HTTP başlık Bearer değeri. Mümkün olduğunda, HTTP üstbilgisi tercih edilir, çünkü sorgu dizeleri sunucu günlüklerinde görünür olma eğilimindedir. Çoğu durumda, Google API'larına aramalarınızı kurmak için bir istemci kitaplığı kullanabilirsiniz (örneğin, zaman Sürücü Dosyalar API çağırma ).

Tüm Google API'leri denemek ve onların kapsamlarını görüntüleyebilir OAuth 2.0 Bahçesi .

HTTP GET örnekleri

Bir çağrı drive.files son nokta (Sürücü Dosyalar API) kullanarak Authorization: Bearer HTTP başlık aşağıdaki gibi görünebilir. Kendi erişim simgenizi belirtmeniz gerektiğini unutmayın:

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

İşte kullanarak kimlik doğrulaması kullanıcı için aynı API bir çağrıdır access_token sorgu dize parametresini:

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

curl örnekler

Sen ile bu komutları test edebilirsiniz curl komut satırı uygulaması. HTTP başlık seçeneğini (tercih edilen) kullanan bir örnek:

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

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

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

Erişim belirteçleri sona erdiğinde

Erişim sağladığı süre sonra sona tarihinde OAuth 2.0 Yetkilendirme Sunucusu tarafından verilen jetonudur expires_in değeri. Bir erişim belirtecinin süresi dolduğunda, uygulama başka bir JWT oluşturmalı, imzalamalı ve başka bir erişim belirteci talep etmelidir.

JWT hata kodları

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

Hizmet hesabı yetkili olduğundan emin olun alan adı çapında heyeti , kullanıcı için Yönetici konsolunun sayfa sub istem (alan).

Genellikle birkaç dakika sürse de, yetkilendirmenin Google Hesabınızdaki tüm kullanıcılara yayılması 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. Yönetici konsolundaki müşteri kimliği (sayısal) yerine müşteri e-posta adresi kullanılarak bir hizmet hesabına yetki verildi. In alan adı çapında heyeti Yönetici konsolunda sayfasında müşteri kaldırmak ve sayısal kimliği ile yeniden ekleyin.
access_denied (herhangi bir değer) Alan genelinde yetki kullanıyorsanız, Yönetici konsolunda bir veya daha fazla istenen kapsam yetkilendirilmemiştir.

Hizmet hesabı yetkili olduğundan emin olun alan adı çapında heyeti , kullanıcı için Yönetici konsolunun sayfa sub istem (alan) ve içerdiği bütün bunlar İçinde isteğinde kapsamları scope senin JWT istem.

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

invalid_grant Not a valid email. Kullanıcı mevcut değil. E-posta adresi kontrol edin sub istem (alanı) doğrudur.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

Genellikle, yerel sistem saatinin doğru olmadığı anlamına gelir. Eğer Ayrıca olabilirdi exp değeri geleceğe fazla 65 dakika olan iat değer veya exp değeri daha düşüktür iat değeri.

JWT'nin oluşturulduğu sistemdeki saatin doğru olduğundan emin olun. Gerekirse, ile zaman senkronize Google NTP .

invalid_grant Invalid JWT Signature.

JWT onayı, müşteri e-postası tarafından tanımlanan hizmet hesabıyla ilişkili olmayan bir özel anahtarla imzalanmıştır veya kullanılan anahtar silinmiştir, devre dışı bırakılmıştır veya süresi dolmuştur.

Alternatif olarak, JWT onayı yanlış kodlanmış olabilir - yeni satırlar veya dolgu eşittir işaretleri olmadan Base64 kodlu olmalıdır.

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

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

invalid_scope Invalid OAuth scope or ID token audience provided. Hiçbir kapsam talep edilmedi (boş kapsam listesi) veya istenen kapsamlardan biri mevcut değil (yani geçersiz).

Emin olun scope JWT iddiası (alan) doldurulur ve hiç hata veya yazım hatası olmadığından emin olmak için, bu kullanım istediğiniz API'ler için belgelenmiş kapsamları ile içerdiğini kapsamları karşılaştırın.

İçinde kapsam listesi bu Not scope iddia ihtiyaçları boşluklarla ayrılmış olması, virgül değildir.

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

Git Google API Consoleve IAM & Yönetim> Servis Hesaplar altından iddiasını imzalamak için kullanılan "Anahtar ID" içeren hizmet hesabını etkinleştirin.

Ek: OAuth olmadan hizmet hesabı yetkilendirmesi

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

Eğer çağrı istediğiniz API yayınlanan bir hizmet tanımı varsa Google API GitHub depo , bir JWT'yi yerine bir erişim belirteci kullanılarak yetkili API çağrıları yapabilirsiniz. Böyle yaparak:

  1. Bir hizmet hesabı oluşturma yukarıda açıklandığı gibi. Hesabı oluştururken aldığınız JSON dosyasını sakladığınızdan emin olun.
  2. Bulunan bu tür bir şekilde, herhangi bir standart JWT'de kütüphane kullanılarak jwt.io : aşağıdaki örnekte olduğu gibi bir başlık ve yük ile bir JWT'yi oluşturmak
    {
      "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
    }
    • İçin kid başlığındaki alanına servis hesabının özel anahtar kimliği belirtin. Sen Bu değeri bulabilirsiniz private_key_id servis hesabı JSON dosyasına alanında.
    • İçin iss ve sub alanları, servis hesabınızın e-posta adresini belirtin. Sen Bu değeri bulabilirsiniz client_email servis hesabı JSON dosyasına alanında.
    • İçin aud alanında API son nokta belirtin. Örneğin: https:// SERVICE .googleapis.com/ .
    • İçin iat alanında, şimdiki Unix zamanı belirtin ve için exp JWT sona erecek zaman alanında, tam olarak 3600 saniye sonra saati belirtin.

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

Örneğin:

Java

Kullanımı google-api-java-istemci ve java-JWT'yi :

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

piton

Kullanılması PyJWT :

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 belirteci olarak imzalanan JWT'yi kullanarak, API çağrısı:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com