Google setzt sich für die Förderung der Rassengerechtigkeit für schwarze Gemeinschaften ein. Siehe wie.

Verwenden von OAuth 2.0 für Server-zu-Server-Anwendungen

Das Google OAuth 2.0-System unterstützt Server-zu-Server-Interaktionen wie die zwischen einer Webanwendung und einem Google-Dienst. Für dieses Szenario müssen Sie ein Dienstkonto, das ist ein Konto , das statt auf einen einzelnen Endverbraucher zu Ihrer Anwendung gehört. Ihre Anwendung ruft Google APIs im Namen des Dienstkontos auf, sodass Nutzer nicht direkt beteiligt sind. Dieses Szenario wird manchmal als "zweibeiniges OAuth" oder "2LO" bezeichnet. (Der verwandte Begriff "dreibeiniges OAuth" bezieht sich auf Szenarien, in denen Ihre Anwendung Google APIs im Namen von Endnutzern aufruft und in denen manchmal die Zustimmung des Nutzers erforderlich ist.)

Normalerweise verwendet eine Anwendung ein Dienstkonto, wenn die Anwendung Google APIs verwendet, um mit ihren eigenen Daten und nicht mit den Daten eines Nutzers zu arbeiten. Beispielsweise würde eine Anwendung, die Google Cloud Datastore für die Datenpersistenz verwendet, ein Dienstkonto verwenden, um ihre Aufrufe an die Google Cloud Datastore API zu authentifizieren.

Google Workspace Domain - Administratoren können auch Service gewähren Konten domänenweiten Behörde für den Zugriff von Benutzerdaten im Namen der Benutzer in der Domäne.

In diesem Dokument wird beschrieben, wie eine Anwendung den Server-zu-Server-OAuth 2.0-Ablauf mithilfe einer Google APIs-Clientbibliothek (empfohlen) oder HTTP abschließen kann.

Überblick

Um die Unterstützung von Server-zu-Server - Interaktionen, zunächst ein Dienstkonto für das Projekt in dem erstellen API Console. Wenn Sie auf Nutzerdaten für Nutzer in Ihrem Google Workspace-Konto zugreifen möchten, delegieren Sie den domainweiten Zugriff an das Dienstkonto.

Anschließend bereitet Ihre Anwendung autorisierte API-Aufrufe vor, indem sie die Anmeldeinformationen des Dienstkontos verwendet, um ein Zugriffstoken vom OAuth 2.0-Authentifizierungsserver anzufordern.

Schließlich kann Ihre Anwendung das Zugriffstoken verwenden, um Google-APIs aufzurufen.

Dienstkonto erstellen

Die Anmeldeinformationen eines Dienstkontos umfassen eine generierte eindeutige E-Mail-Adresse und mindestens ein öffentliches/privates Schlüsselpaar. Wenn die domänenweite Delegierung aktiviert ist, ist eine Client-ID auch Teil der Anmeldeinformationen des Dienstkontos.

Wenn Ihre Anwendung auf Google App Engine ausgeführt wird, wird beim Erstellen Ihres Projekts automatisch ein Dienstkonto eingerichtet.

Wenn Ihre Anwendung auf Google Compute Engine ausgeführt wird, wird beim Erstellen Ihres Projekts auch automatisch ein Dienstkonto eingerichtet. Sie müssen jedoch die Bereiche angeben, auf die Ihre Anwendung Zugriff benötigt, wenn Sie eine Google Compute Engine-Instanz erstellen. Weitere Informationen finden Sie Vorbereiten einer Instanz Nutzung von Dienstkonten .

Wenn Ihre Anwendung auf Google App Engine oder Google Compute Engine läuft nicht, müssen Sie diese Anmeldeinformationen in der erhalten Google API Console. Gehen Sie wie folgt vor, um Dienstkonto-Anmeldeinformationen zu generieren oder die bereits generierten öffentlichen Anmeldeinformationen anzuzeigen:

  1. Öffnen Sie das Service accounts page .
  2. If prompted, select a project, or create a new one.
  3. Klicken Sie auf Dienstkonto erstellen .
  4. Unter Dienstkontodaten geben Sie einen Namen, ID, und eine Beschreibung für das Dienstkonto, klicken Sie auf Create.
  5. Optional: Wählen Sie unter Berechtigungen für Dienstkonten die IAM-Rollen aus, die dem Dienstkonto gewährt werden sollen, und klicken Sie dann auf Weiter .
  6. Optional: Fügen Sie unter Benutzer Zugriff auf dieses Dienstkonto gewähren die Benutzer oder Gruppen hinzu, die das Dienstkonto verwenden und verwalten dürfen.
  7. Klicken Sie Schlüssel erstellen, klicken Sie auf Erstellen.

Ihr neues öffentliches / privates Schlüsselpaar wird generiert und auf Ihren Computer heruntergeladen. Es dient als einzige Kopie des privaten Schlüssels. Sie sind für die sichere Aufbewahrung verantwortlich. Wenn Sie dieses Schlüsselpaar verlieren, müssen Sie ein neues generieren.

Wenn Sie dem Dienstkonto eine domänenweite G Suite-Berechtigung erteilen müssen, klicken Sie auf die E-Mail-Adresse des von Ihnen erstellten Dienstkontos und kopieren Sie den Wert aus dem Feld Eindeutige ID .

Verwenden Sie den Wert, den Sie als Client-ID kopiert haben, um die Berechtigung an das Dienstkonto zu delegieren.

Sie können auf die Rückkehr API Console jederzeit die E - Mail - Adresse, den öffentlichen Schlüssel Fingerabdrücke und andere Informationen, oder zu generieren zusätzliche öffentliche / private Schlüsselpaare zu sehen. Für weitere Informationen über Service - Kontoinformationen in dem API Consolefinden Dienstkonten in der API ConsoleHilfedatei.

Notieren Sie sich die E-Mail-Adresse des Dienstkontos und speichern Sie die private Schlüsseldatei des Dienstkontos an einem für Ihre Anwendung zugänglichen Ort. Ihre Anwendung benötigt sie, um autorisierte API-Aufrufe zu tätigen.

Domainweite Autorität an das Dienstkonto delegieren

Wenn Sie ein Google Workspace-Konto haben, kann ein Administrator der Organisation eine Anwendung autorisieren, im Namen von Nutzern in der Google Workspace-Domain auf Nutzerdaten zuzugreifen. Beispielsweise würde eine Anwendung, die die Google Kalender-API verwendet, um Ereignisse zu den Kalendern aller Nutzer in einer Google Workspace-Domain hinzuzufügen, ein Dienstkonto verwenden, um im Namen der Nutzer auf die Google Kalender-API zuzugreifen. Die Autorisierung eines Dienstkontos zum Zugriff auf Daten im Namen von Benutzern in einer Domäne wird manchmal als "Delegieren einer domänenweiten Autorität" an ein Dienstkonto bezeichnet.

Um domänenweiten Behörde zu einem Dienstkonto delegieren, erster domänenweite Delegation für einen bestehenden Dienstkonto in dem aktivieren Service accounts page oder ein neues Dienstkonto erstellen mit domänenweiten Delegation aktiviert.

Anschließend muss ein Super Admin der Google Workspace-Domain die folgenden Schritte ausführen:

  1. Von Ihrem Google - Workspace Domain - Admin - Konsole gehen, zum Hauptmenü > Sicherheit> API Steuerelemente.
  2. Im Domain breiten Delegation Bereich wählen Domain Breite Delegation verwalten.
  3. Klicken Sie auf Neu hinzufügen.
  4. In dem Client - ID - Feld, geben Sie das Client - ID des Dienstkontos. Sie können Ihr Dienstkonto des Kunden - ID in der finden Service accounts page.
  5. In den OAuth - Bereiche (kommagetrennte) Feld geben Sie die Liste der Bereiche , dass Ihre Anwendung sollte der Zugang zu gewähren. Zum Beispiel, wenn Ihre Anwendung domänenweiten vollen Zugriff auf das Google Drive API und dem Google Calendar API, geben Sie: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / Kalender.
  6. Klicken Sie auf Autorisieren.

Ihre Anwendung ist jetzt berechtigt, API-Aufrufe als Benutzer in Ihrer Domain durchzuführen (um sich als Benutzer auszugeben). Wenn Sie autorisierte API-Aufrufe vorbereiten, geben Sie den Benutzer für den Identitätswechsel an.

Vorbereiten eines autorisierten API-Aufrufs

Java

Nachdem Sie die Client - E - Mail - Adresse und einen privaten Schlüssel aus dem erhalten API Console, die verwenden Google APIs - GoogleCredential Client - Bibliothek für Java zur Schaffung eines GoogleCredential Objekt aus dem Dienstkonto die Anmeldeinformationen und die Bereiche Ihrer Anwendung Zugriff auf benötigt. Zum Beispiel:

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));

Wenn Sie eine App auf Google Cloud Platform entwickeln, können Sie die Verwendung Anwendung Standardanmeldeinformationen statt, die den Prozess vereinfachen kann.

Domainweite Autorität delegieren

Wenn Sie domänenweiten Zugriff auf das Dienstkonto delegiert haben und mögen , dass Sie ein Benutzerkonto imitieren, geben Sie die E - Mail - Adresse des Benutzerkontos mit der createDelegated Methode des GoogleCredential Objekts. Zum Beispiel:

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

Verwenden Sie das GoogleCredential Objekt Google APIs in Ihrer Anwendung zu nennen.

Python

Nachdem Sie die Client - E - Mail - Adresse und einen privaten Schlüssel aus dem erhalten API Console, die verwenden Google APIs - Client - Bibliothek für Python , die folgenden Schritte ausführen:

  1. Erstellen Sie ein Credentials Objekt aus den Anmeldeinformationen des Dienstkonto und die Bereiche Ihrer Anwendung Zugriff auf benötigt. Zum Beispiel:
    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)

    Wenn Sie eine App auf Google Cloud Platform entwickeln, können Sie die Verwendung Anwendung Standardanmeldeinformationen statt, die den Prozess vereinfachen kann.

  2. Domainweite Autorität delegieren

    Wenn Sie domänenweiten Zugriff auf das Dienstkonto delegiert haben , und Sie möchten ein Benutzerkonto imitieren, verwenden Sie die with_subject Methode eines bestehenden ServiceAccountCredentials Objekt. Zum Beispiel:

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

Verwenden Sie das Credentials-Objekt, um Google-APIs in Ihrer Anwendung aufzurufen.

HTTP/REST

Nachdem Sie die Client - ID und den privaten Schlüssel aus dem erhalten API Console, benötigt Ihre Anwendung die folgenden Schritte durchführen:

  1. Erstellen Sie ein JSON Web Token (JWT, ausgesprochen "jot"), das einen Header, einen Anspruchssatz und eine Signatur enthält.
  2. Fordern Sie ein Zugriffstoken vom Google OAuth 2.0-Autorisierungsserver an.
  3. Behandeln Sie die JSON-Antwort, die der Autorisierungsserver zurückgibt.

In den folgenden Abschnitten wird beschrieben, wie diese Schritte ausgeführt werden.

Wenn die Antwort ein Zugriffstoken enthält, können Sie das Zugriffstoken verwenden , um ein Google - API aufrufen . (Wenn die Antwort kein Zugriffstoken enthält, sind Ihre JWT- und Token-Anforderung möglicherweise nicht richtig gebildet oder das Dienstkonto verfügt möglicherweise nicht über die Berechtigung zum Zugriff auf die angeforderten Bereiche.)

Wenn das Zugriffstoken abläuft , erzeugt die Anwendung eine andere JWT, zu unterzeichnen, und fordert eine andere Zugriffstoken.

Ihre Serveranwendung verwendet ein JWT, um ein Token vom Google-Autorisierungsserver anzufordern, und verwendet dann das Token, um einen Google-API-Endpunkt aufzurufen. Es ist kein Endbenutzer beteiligt.

Der Rest dieses Abschnitts beschreibt die Einzelheiten zum Erstellen eines JWT, zum Signieren des JWT, zum Bilden der Zugriffstoken-Anforderung und zum Verarbeiten der Antwort.

Erstellen eines JWT

Ein JWT besteht aus drei Teilen: einem Header, einem Anspruchssatz und einer Signatur. Der Header und der Anspruchssatz sind JSON-Objekte. Diese JSON-Objekte werden in UTF-8-Bytes serialisiert und dann mit der Base64url-Codierung codiert. Diese Codierung bietet Widerstandsfähigkeit gegenüber Codierungsänderungen aufgrund wiederholter Codierungsoperationen. Der Header, Ansprüche, und die Unterschrift werden mit einer Periode verketteten zusammen ( . ) Charakter.

Ein JWT setzt sich wie folgt zusammen:

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

Die Basiszeichenfolge für die Signatur lautet wie folgt:

{Base64url encoded header}.{Base64url encoded claim set}
JWT-Header bilden

Der Header besteht aus zwei Feldern, die den Signaturalgorithmus und das Format der Assertion angeben. Beide Felder sind Pflichtfelder und jedes Feld hat nur einen Wert. Wenn zusätzliche Algorithmen und Formate eingeführt werden, ändert sich dieser Header entsprechend.

Dienstkonten basieren auf dem RSA SHA-256-Algorithmus und dem JWT-Token-Format. Als Ergebnis sieht die JSON-Darstellung des Headers wie folgt aus:

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

Die Base64url-Darstellung davon ist wie folgt:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
Bildung des JWT-Anspruchssatzes

Der JWT-Anspruchssatz enthält Informationen über das JWT, einschließlich der angeforderten Berechtigungen (Bereiche), des Ziels des Tokens, des Ausstellers, des Zeitpunkts der Tokenausgabe und der Lebensdauer des Tokens. Die meisten Felder sind Pflichtfelder. Der JWT-Anspruchssatz ist wie der JWT-Header ein JSON-Objekt und wird bei der Berechnung der Signatur verwendet.

Erforderliche Ansprüche

Die erforderlichen Ansprüche im JWT-Anspruchssatz sind unten aufgeführt. Sie können in beliebiger Reihenfolge im Anspruchssatz erscheinen.

Name Beschreibung
iss Die E-Mail-Adresse des Dienstkontos.
scope Eine durch Leerzeichen getrennte Liste der Berechtigungen, die die Anwendung anfordert.
aud Ein Deskriptor des beabsichtigten Ziels der Behauptung. Wenn dieser Wert einen Zugriffstoken antrag ist immer https://oauth2.googleapis.com/token .
exp Die Ablaufzeit der Assertion, angegeben als Sekunden seit 00:00:00 UTC, 1. Januar 1970. Dieser Wert darf maximal 1 Stunde nach der ausgegebenen Zeit liegen.
iat Die Zeit, zu der die Assertion ausgegeben wurde, angegeben als Sekunden seit 00:00:00 UTC, 1. Januar 1970.

Die JSON-Darstellung der erforderlichen Felder in einem JWT-Anspruchssatz ist unten dargestellt:

{
  "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
}
Zusätzliche Ansprüche

In einigen Unternehmensfällen kann eine Anwendung die domänenweite Delegierung verwenden, um im Namen eines bestimmten Benutzers in einer Organisation zu handeln. Die Berechtigung zur Durchführung dieses Identitätswechsels muss erteilt werden, bevor eine Anwendung die Identität eines Benutzers annehmen kann, und wird normalerweise von einem Superadministrator verwaltet. Weitere Informationen finden Sie Control - API - Zugriff mit domänenweiten Delegation .

Einen Zugriffstoken , das gewährt eine Anwendung Zugriff auf eine Ressource übertragen, umfasst die E - Mail - Adresse des Benutzers in dem JWT Anspruch Satz als der Wert des erhalten sub field.

Name Beschreibung
sub Die E-Mail-Adresse des Benutzers, für den die Anwendung den delegierten Zugriff anfordert.

Wenn eine Anwendung nicht über die Berechtigung einen Benutzer, die Antwort auf eine Zugriffstoken Anfrage zum Imitieren , die das enthält sub wird ein seinen Fehler .

Ein Beispiel eines JWT Anspruch Satz, der die umfasst sub wird unten dargestellt:

{
  "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
}
Den JWT-Anspruchssatz codieren

Wie der JWT-Header sollte der JWT-Anspruchssatz in UTF-8 serialisiert und Base64url-sicher codiert werden. Unten sehen Sie ein Beispiel für eine JSON-Darstellung eines JWT-Anspruchssatzes:

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

JSON Web Signature (JWS) ist die Angabe , dass Führer die Mechanik der Signatur für die JWT zu erzeugen. Die Eingabe für die Signatur ist das Byte-Array mit folgendem Inhalt:

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

Bei der Berechnung der Signatur muss der Signaturalgorithmus im JWT-Header verwendet werden. Der einzige vom Google OAuth 2.0-Autorisierungsserver unterstützte Signaturalgorithmus ist RSA mit dem SHA-256-Hashing-Algorithmus. Dies wird ausgedrückt als RS256 im alg - Feld in den JWT - Header.

Melden der UTF-8 - Darstellung des Eingangs Verwendung SHA256withRSA (auch bekannt als RSASSA-PKCS1-v1_5-SIGN mit der SHA-256 - Hash - Funktion) mit dem privaten Schlüssel aus dem erhaltenen Google API Console. Die Ausgabe wird ein Byte-Array sein.

Die Signatur muss dann Base64url-kodiert sein. Der Header, Ansprüche, und die Unterschrift werden mit einer Periode verketteten zusammen ( . ) Charakter. Das Ergebnis ist das JWT. Es sollte wie folgt lauten (Zeilenumbrüche zur Verdeutlichung hinzugefügt):

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

Unten ist ein Beispiel für ein JWT vor der Base64url-Codierung:

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

Unten sehen Sie ein Beispiel für ein JWT, das signiert wurde und zur Übertragung bereit ist:

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

Zugriffstoken-Anfrage stellen

Nach dem Generieren des signierten JWT kann eine Anwendung damit ein Zugriffstoken anfordern. Diese Zugriffstokenanforderung ist eine HTTPS POST - Anforderung und der Körper URL kodiert. Die URL wird unten angezeigt:

https://oauth2.googleapis.com/token

Die folgenden Parameter werden in der HTTPS erforderlich POST Anfrage:

Name Beschreibung
grant_type Verwenden Sie die folgende Zeichenfolge, URL-codiert als notwendig: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion Das JWT, inklusive Unterschrift.

Nachfolgend finden Sie eine rohe Dump des HTTPS - POST in einem Zugriffstoken Anfrage verwendet Anfrage:

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

Im Folgenden finden Sie die gleiche Anforderung, mit 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

Umgang mit der Antwort

Wenn die JWT- und Zugriffstoken-Anforderung richtig gebildet sind und das Dienstkonto die Berechtigung zum Ausführen des Vorgangs hat, enthält die JSON-Antwort vom Autorisierungsserver ein Zugriffstoken. Das Folgende ist eine Beispielantwort:

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

Zugriffstoken kann von dem angegebenen während der Dauer Fenster wiederverwendet wird expires_in Wert.

Aufrufen von Google-APIs

Java

Verwenden Sie das GoogleCredential Objekt Google - APIs aufrufen , indem Sie die folgenden Schritte ausführen:

  1. Erstellen Sie ein Dienstobjekt für die API , dass Sie die Verwendung anrufen möchten GoogleCredential Objekt. Zum Beispiel:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. Stellen Sie Anfragen an den API - Dienst mit dem Interface von dem Dienstobjekt zur Verfügung gestellt . : Zum Beispiel der Instanzen von Cloud SQL - Datenbanken in dem spannenden-example-123 - Projekt zur Liste
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

Verwenden Sie die autorisierten Credentials Objekt Google - APIs aufrufen , indem Sie die folgenden Schritte ausführen:

  1. Erstellen Sie ein Dienstobjekt für die API, die Sie aufrufen möchten. Sie bauen aa Dienstobjekt durch den Aufruf build - Funktion mit dem Namen und der Version der API und dem autorisierten Credentials Objekt. : Zum Beispiel, Version 1beta3 der Cloud SQL - Administration API aufrufen
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. Stellen Sie Anfragen an den API - Dienst mit dem Interface von dem Dienstobjekt zur Verfügung gestellt . : Zum Beispiel der Instanzen von Cloud SQL - Datenbanken in dem spannenden-example-123 - Projekt zur Liste
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

Nachdem Ihre Anwendung ein Zugriffstoken erhalten hat, können Sie das Token verwenden, um im Namen eines bestimmten Dienstkontos oder Benutzerkontos Aufrufe an eine Google-API zu tätigen, wenn der/die von der API erforderliche(n) Zugriffsumfang(e) gewährt wurden. Dazu gehört die Zugriffstoken in einer Anfrage an die API , indem entweder einen access_token Abfrageparameter oder ein Authorization HTTP - Header - Bearer - Wert. Wenn möglich, ist der HTTP-Header vorzuziehen, da Abfragezeichenfolgen in der Regel in Serverprotokollen sichtbar sind. In den meisten Fällen können Sie eine Client - Bibliothek verwenden , um Ihre Anrufe auf Google APIs einzurichten (zum Beispiel, wenn das Drive Files API aufrufen ).

Sie können alle Google APIs ausprobieren und sehen ihre Bereiche auf der OAuth 2.0 Spielplatz .

HTTP GET-Beispiele

Ein Aufruf des drive.files Endpunkt (der Drive Files API) , die mit Authorization: Bearer - HTTP - Header könnte wie folgt aussehen. Beachten Sie, dass Sie Ihr eigenes Zugriffstoken angeben müssen:

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

Hier ist ein Aufruf an die gleiche API für den authentifizierten Benutzer die Verwendung access_token Query - String - Parameter:

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

curl Beispiele

Sie können diese Befehle mit der Test curl Befehlszeilenanwendung. Hier ist ein Beispiel, das die HTTP-Header-Option verwendet (bevorzugt):

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

Oder alternativ die Parameteroption Abfragezeichenfolge:

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

Wenn Zugriffstoken ablaufen

Zugriffstoken durch die Google OAuth 2.0 Autorisierungsserver laufen nach der Dauer zur Verfügung gestellt von dem ausgegebenen expires_in Wert. Wenn ein Zugriffstoken abläuft, sollte die Anwendung ein weiteres JWT generieren, es signieren und ein weiteres Zugriffstoken anfordern.

JWT-Fehlercodes

error error_description Feld Bedeutung So lösen Sie
unauthorized_client Unauthorized client or scope in request. Wenn Sie versuchen, die domainweite Delegierung zu verwenden, ist das Dienstkonto in der Admin-Konsole der Domain des Nutzers nicht autorisiert.

Stellen Sie sicher , dass das Dienstkonto in der autorisiert ist Domain weiten Delegation Seite der Administratorkonsole für den Benutzer in dem sub Anspruch (Feld).

Obwohl es normalerweise einige Minuten dauert, kann es bis zu 24 Stunden dauern, bis die Autorisierung an alle Nutzer in Ihrem Google-Konto weitergegeben wird.

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. Ein Dienstkonto wurde mithilfe der Client-E-Mail-Adresse statt der Client-ID (numerisch) in der Admin-Konsole autorisiert. Im Domain weiten Delegation in der Admin - Konsole, entfernen Sie den Client und erneut fügen Sie ihn mit der numerischen ID.
access_denied (beliebiger Wert) Wenn Sie die domainweite Delegierung verwenden, sind mindestens ein angeforderter Bereich in der Admin-Konsole nicht autorisiert.

Stellen Sie sicher , dass das Dienstkonto in der autorisiert ist Domain weiten Delegation Seite der Admin - Konsole für den Benutzer im sub Anspruch (Feld), und dass sie alle die umfassen Tive Sie in dem anfordernden scope Anspruch Ihres JWT.

Obwohl es normalerweise einige Minuten dauert, kann es bis zu 24 Stunden dauern, bis die Autorisierung an alle Nutzer in Ihrem Google-Konto weitergegeben wird.

invalid_grant Not a valid email. Der Benutzer existiert nicht. Überprüfen Sie, ob die E - Mail - Adresse in das sub Anspruch (Feld) korrekt ist.
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.

Normalerweise bedeutet dies, dass die lokale Systemzeit nicht korrekt ist. Es könnte auch passieren , wenn der exp Wert von mehr als 65 Minuten in der Zukunft von der ist iat Wert oder der exp - Wert niedriger als iat Wert.

Stellen Sie sicher, dass die Uhr auf dem System, auf dem das JWT generiert wird, korrekt ist. Falls erforderlich, synchronisieren Sie Ihre Zeit mit Google NTP .

invalid_grant Invalid JWT Signature.

Die JWT-Assertion ist mit einem privaten Schlüssel signiert, der nicht mit dem durch die Client-E-Mail identifizierten Dienstkonto verknüpft ist, oder der verwendete Schlüssel wurde gelöscht, deaktiviert oder ist abgelaufen.

Alternativ kann die JWT-Assertion falsch codiert sein – sie muss Base64-codiert sein, ohne Zeilenumbrüche oder aufgefüllte Gleichheitszeichen.

Decodieren Sie den JWT-Anspruchssatz und überprüfen Sie, ob der Schlüssel, mit dem die Assertion signiert wurde, mit dem Dienstkonto verknüpft ist.

Versuchen Sie, eine von Google bereitgestellte OAuth-Bibliothek zu verwenden, um sicherzustellen, dass das JWT korrekt generiert wird.

invalid_scope Invalid OAuth scope or ID token audience provided. Es wurden keine Bereiche angefordert (leere Liste von Bereichen) oder einer der angeforderten Bereiche existiert nicht (dh ist ungültig).

Stellen Sie sicher , dass der scope Anspruch (Feld) des JWT ausgefüllt ist, und vergleichen Sie die Bereiche , dass es mit den dokumentierten Bereiche für die APIs enthält , die Sie verwenden möchten, um sicherzustellen , gibt es keine Fehler oder Tippfehler.

Beachten Sie, dass die Liste der Bereiche in den scope Anspruch Bedürfnisse durch Leerzeichen getrennt werden, keine Kommas.

disabled_client The OAuth client was disabled. Der zum Signieren der JWT-Assertion verwendete Schlüssel ist deaktiviert.

Gehen Sie auf den Google API Consoleund unter IAM & Admin> Dienstkonten ermöglicht es das Dienstkonto, das den „Schlüssel - ID“ enthält verwendet , um die Behauptung zu unterschreiben.

Nachtrag: Dienstkontoautorisierung ohne OAuth

Bei einigen Google-APIs können Sie autorisierte API-Aufrufe mit einem signierten JWT direkt als Bearer-Token anstelle eines OAuth 2.0-Zugriffstokens tätigen. Wenn dies möglich ist, können Sie vermeiden, dass Sie vor einem API-Aufruf eine Netzwerkanfrage an den Autorisierungsserver von Google stellen müssen.

Wenn die API Sie anrufen möchten eine Service - Definition veröffentlicht in der hat Google APIs GitHub - Repository können Sie autorisierte API - Aufrufe mit einem JWT statt ein Zugriffstoken machen. Um dies zu tun:

  1. Erstellen eines Dienstkontos , wie oben beschrieben. Bewahren Sie die JSON-Datei auf, die Sie beim Erstellen des Kontos erhalten.
  2. Mit einem beliebigen Standard JWT Bibliothek, wie man sie bei gefunden jwt.io , eine JWT mit einem Header und Payload wie das folgende Beispiel erstellen:
    {
      "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
    }
    • Für das kid Feld in der Kopfzeile, geben Sie Ihren Dienst privaten Schlüssel ID Konto. Sie können diesen Wert in dem finden private_key_id Feld des Dienstkonto JSON - Datei.
    • Für die iss und sub geben Sie Ihr Service - Konto der E-Mail - Adresse. Sie können diesen Wert in dem finden client_email Feld des Dienstkonto JSON - Datei.
    • Für das aud Feld des API - Endpunkt. Zum Beispiel: https:// SERVICE .googleapis.com/ .
    • Für das iat Feld der aktuelle Unix - Zeit und für das exp Feld, die Zeit genau 3.600 Sekunden später angeben, wenn der JWT abläuft.

Signieren Sie das JWT mit RSA-256 mithilfe des privaten Schlüssels, der in der JSON-Datei Ihres Dienstkontos enthalten ist.

Zum Beispiel:

Java

Mit google-api-java-Client und 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

Mit 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. Rufen Sie die API, die signierte JWT verwendet als Träger Token:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com