Authentifizierung zwischen Diensten
Neben der Authentifizierung von Endnutzeranfragen können Sie auch Dienste authentifizieren (nicht-menschliche Nutzer), die Anfragen an Ihre API senden. Auf dieser Seite wird erläutert, wie Sie Dienstkonten für die Authentifizierung für Personen oder Dienste verwenden.
Überblick
Zur Identifizierung eines Dienstes, der Anfragen an die API sendet, wird ein Dienstkonto verwendet. Mit dem privaten Schlüssel des Dienstkontos signiert der aufrufende Dienst ein sicheres JSON Web Token (JWT) und sendet es in der Anfrage an die API.
So implementieren Sie die Dienstkontoauthentifizierung in Ihrer API und im aufrufenden Dienst:
- Erstellen Sie ein Dienstkonto und einen Schlüssel für den aufrufenden Dienst.
- Fügen Sie in der API-Konfiguration für Ihren API-Gateway-Dienst Unterstützung für die Authentifizierung hinzu.
- Ergänzen Sie den Code des aufrufenden Dienstes so, dass: - ein JWT erstellt und mit dem privaten Schlüssel des Dienstkontos signiert wird und
- das signierte JWT in einer Anfrage an die API gesendet wird.
 
API Gateway prüft, ob die Anforderungen im JWT mit der Konfiguration in der API-Konfiguration übereinstimmen, bevor die Anfrage an die API weitergeleitet wird. API Gateway prüft nicht die Cloud Identity-Berechtigungen, die Sie für das Dienstkonto gewährt haben.
Vorbereitung
Folgende Voraussetzungen sollten erfüllt sein:
- Sie haben ein Google Cloud Projekt erstellt. 
Dienstkonto mit einem Schlüssel erstellen
Sie benötigen ein Dienstkonto mit einer privaten Schlüsseldatei, die der aufrufende Dienst zum Signieren des JWT verwendet. Wenn mehrere Dienste Anfragen an Ihre API senden, können Sie ein einziges Dienstkonto für alle aufrufenden Dienste erstellen. Falls Sie zwischen den Diensten unterscheiden müssen, weil diese beispielsweise unterschiedliche Berechtigungen haben, können Sie pro aufrufendem Dienst ein Dienstkonto und einen Schlüssel erstellen.
In diesem Abschnitt wird gezeigt, wie Sie mit der Google Cloud Console und dem gcloud-Befehlszeilentool das Dienstkonto und die Datei mit dem privaten Schlüssel erstellen und dem Dienstkonto die Rolle Ersteller von Dienstkonto-Tokens zuweisen. Wie Sie diese Schritte mithilfe einer API ausführen, erfahren Sie unter Dienstkonten erstellen und verwalten.
So erstellen Sie ein Dienstkonto mit einem Schlüssel:
Google Cloud console
Erstellen Sie ein Dienstkonto:
- Wechseln Sie in der Google Cloud Console zu Dienstkonto erstellen. 
- Wählen Sie ein Projekt aus. 
- Geben Sie im Feld Dienstkontoname einen Namen ein. DieGoogle Cloud -Konsole füllt das Feld Dienstkonto-ID anhand dieses Namens aus. 
- Optional: Geben Sie im Feld Dienstkontobeschreibung eine Beschreibung ein. 
- Klicken Sie auf Erstellen. 
- Klicken Sie auf das Feld Rolle auswählen. - Wählen Sie unter Alle Rollen Dienstkonten > Ersteller von Dienstkonto-Tokens aus. 
- Klicken Sie auf Weiter. 
- Klicken Sie auf Fertig, um das Erstellen des Dienstkontos abzuschließen. - Schließen Sie das Browserfenster nicht. Sie werden ihn im nächsten Verfahren verwenden. 
Erstellen Sie einen Dienstkontoschlüssel:
- Klicken Sie in der Google Cloud Console auf die E-Mail-Adresse des von Ihnen erstellten Dienstkontos.
- Klicken Sie auf Schlüssel.
- Klicken Sie auf Schlüssel hinzufügen > Neuen Schlüssel erstellen.
- Klicken Sie auf Erstellen. Daraufhin wird eine JSON-Schlüsseldatei auf Ihren Computer heruntergeladen.
- Klicken Sie auf Schließen.
gcloud
Die folgenden Befehle können Sie mit dem Google Cloud CLI auf Ihrem lokalen Computer oder in Cloud Shell ausführen.
- Legen Sie das Standardkonto für - gcloudfest. Wenn Sie mehrere Konten haben, müssen Sie das Konto auswählen, das sich im zu verwendenden Google Cloud -Projekt befindet:- gcloud auth login
- Rufen Sie die Projekt-IDs für Ihre Google Cloud -Projekte ab. - gcloud projects list
- Legen Sie das Standardprojekt fest. Ersetzen Sie - PROJECT_IDdurch die Google Cloud Projekt-ID, die Sie verwenden möchten.- gcloud config set project PROJECT_ID 
- Erstellen Sie ein Dienstkonto. Ersetzen Sie - SA_NAMEund- SA_DISPLAY_NAMEdurch den zu verwendenden Namen bzw. Anzeigenamen:- gcloud iam service-accounts create SA_NAME \ --display-name "SA_DISPLAY_NAME" 
- Rufen Sie die E-Mail-Adresse des gerade erstellten Dienstkontos ab: - gcloud iam service-accounts list
- Fügen Sie die Rolle Ersteller von Dienstkonto-Tokens hinzu. Ersetzen Sie - SA_EMAIL_ADDRESSdurch die E-Mail-Adresse des Dienstkontos.- gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:SA_EMAIL_ADDRESS \ --role roles/iam.serviceAccountTokenCreator 
- Erstellen Sie im aktuellen Arbeitsverzeichnis eine Schlüsseldatei für das Dienstkonto. Ersetzen Sie dabei - FILE_NAMEdurch den Namen, den Sie für die Schlüsseldatei verwenden möchten. Mit dem Befehl- gcloudwird standardmäßig eine JSON-Datei erstellt.- gcloud iam service-accounts keys create FILE_NAME.json \ --iam-account SA_EMAIL_ADDRESS 
Weitere Informationen zu den vorherigen Befehlen finden Sie in der Referenz zu gcloud.
Informationen zum Schutz des privaten Schlüssels finden Sie unter Best Practices für die Verwaltung von Anmeldedaten.
API für die Authentifizierung konfigurieren
Wenn Sie eine API-Konfiguration für das Gateway erstellen, geben Sie ein Dienstkonto an, das Ihr Gateway für die Interaktion mit anderen Diensten verwendet. Um die Authentifizierung von Dienstkonten für Dienste, die Ihr Gateway aufrufen, zu aktivieren, ändern Sie das Sicherheitsanforderungsobjekt und das Sicherheitsdefinitionsobjekt in Ihrer API-Konfiguration. Wenn Sie die folgenden Schritte ausführen, kann API Gateway die Anforderungen im signierten JWT validieren, das von den aufrufenden Diensten verwendet wird.
- Fügen Sie das Dienstkonto als Aussteller in der API-Konfiguration hinzu. - securityDefinitions: DEFINITION_NAME: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "SA_EMAIL_ADDRESS" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/SA_EMAIL_ADDRESS"- Ersetzen Sie DEFINITION_NAMEdurch einen String, der diese Sicherheitsdefinition bezeichnet. Sie könnten dazu den Namen des Dienstkontos verwenden oder einen Namen, der den anrufenden Dienst identifiziert.
- Ersetzen Sie SA_EMAIL_ADDRESSdurch die E-Mail-Adresse des Dienstkontos.
- Sie können in Ihrer API-Konfiguration mehrere Sicherheitsdefinitionen festlegen, allerdings muss jede Definition einen anderen x-google-issuerhaben. Nachdem Sie getrennte Dienstkonten für jeden aufrufenden Dienst erstellt haben, legen Sie für jeden Dienst eine Sicherheitsdefinition fest. Beispiel:
 - securityDefinitions: service-1: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-1@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-1@example-project-12345.iam.gserviceaccount.com" service-2: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "service-2@example-project-12345.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/service-2@example-project-12345.iam.gserviceaccount.com"
- Ersetzen Sie 
- Fügen Sie optional - x-google-audiencesin den Abschnitt- securityDefinitionsein. Wenn Sie- x-google-audiencesnicht hinzufügen, verlangt API Gateway, dass die Anforderung- "aud"(Zielgruppe) im JWT das Format- https://SERVICE_NAMEhat, wobei SERVICE_NAME der Name Ihres API Gateway-Dienstes ist, den Sie im Feld- hostIhres OpenAPI-Dokuments konfiguriert haben.
- Fügen Sie den Abschnitt - securityentweder auf der obersten Ebene der Datei (nicht eingerückt oder verschachtelt) ein, um ihn auf die gesamte API anzuwenden, oder auf der Methodenebene, um ihn auf eine bestimmte Methode zu beschränken. Wenn Sie den Abschnitt- securitysowohl auf der API-Ebene als auch auf der Methodenebene verwenden, werden die Einstellungen auf der API-Ebene durch die Einstellungen auf der Methodenebene überschrieben.- security: - DEFINITION_NAME: [] - Ersetzen Sie DEFINITION_NAMEdurch den Namen, den Sie im AbschnittsecurityDefinitionsverwendet haben.
- Wenn Sie mehrere Definitionen im Abschnitt - securityDefinitionshaben, fügen Sie sie im Abschnitt- securityhinzu. Beispiel:- security: - service-1: [] - service-2: [] 
 
- Ersetzen Sie 
- Stellen Sie die aktualisierte API-Konfiguration bereit. 
Bevor API Gateway eine Anfrage an Ihre API weiterleitet, prüft API Gateway:
- Die Signatur des JWT mithilfe des öffentlichen Schlüssels, der sich im URI befindet und im Feld x-google-jwks_urider API-Konfiguration angegeben wurde.
- Ob die Anforderung "iss"(issuer) im JWT mit dem im Feldx-google-issuerangegebenen Wert übereinstimmt.
- Ob die Anforderung "aud"(Zielgruppe) im JWT den Namen des API Gateway-Dienstes enthält oder mit einem der Werte übereinstimmt, die Sie im Feldx-google-audiencesangegeben haben.
- Ob das Token abgelaufen ist. Das erfolgt mithilfe der Anforderung "exp"(expiration time).
Weitere Informationen zu x-google-issuer, x-google-jwks_uri und x-google-audiences finden Sie unter OpenAPI-Erweiterungen.
Authentifizierte Anfrage an eine API Gateway API senden
Bei einer authentifizierten Anfrage sendet der aufrufende Dienst ein JWT, das vom Dienstkonto signiert wurde, das Sie in der API Konfiguration angegeben haben. Der anrufende Dienst muss folgende Schritte ausführen:
- Ein JWT erstellen und mit dem privaten Schlüssel des Dienstkontos signieren.
- Das signierte JWT in einer Anfrage an die API senden.
Der folgende Beispielcode veranschaulicht diesen Prozess für ausgewählte Sprachen. Wenn Sie eine authentifizierte Anfrage in anderen Sprachen stellen möchten, jwt.io.
- Fügen Sie im aufrufenden Dienst die folgende Funktion hinzu und übergeben Sie ihr folgende Parameter:
Java - saKeyfile: Der vollständige Pfad zum privaten Schlüssel des Dienstkontos.
- 
saEmail: Die E-Mail-Adresse des Dienstkontos.
- 
audience: Wenn Sie das Feldx-google-audiencesin der API-Konfiguration eingefügt haben, legen Sieaudienceauf einen der Werte fest, die Sie fürx-google-audiencesangegeben haben. Setzen Sie andernfallsaudienceaufhttps://SERVICE_NAME, wobeiSERVICE_NAMEder Name des API Gateway-Dienstes ist.
- expiryLength: Die Ablaufzeit des JWT in Sekunden.
 Python - 
sa_keyfile: Der vollständige Pfad zum privaten Schlüssel des Dienstkontos.
- 
sa_email: Die E-Mail-Adresse des Dienstkontos.
- 
audience: Wenn Sie das Feldx-google-audiencesin der API-Konfiguration eingefügt haben, legen Sieaudienceauf einen der Werte fest, die Sie fürx-google-audiencesangegeben haben. Setzen Sie andernfallsaudienceaufhttps://SERVICE_NAME, wobeiSERVICE_NAMEder Name des API Gateway-Dienstes ist.
- expiry_length: Die Ablaufzeit des JWT in Sekunden.
 Go - saKeyfile: Der vollständige Pfad zum privaten Schlüssel des Dienstkontos.
- 
saEmail: Die E-Mail-Adresse des Dienstkontos.
- 
audience: Wenn Sie das Feldx-google-audiencesin der API-Konfiguration eingefügt haben, legen Sieaudienceauf einen der Werte fest, die Sie fürx-google-audiencesangegeben haben. Setzen Sie andernfallsaudienceaufhttps://SERVICE_NAME, wobeiSERVICE_NAMEder Name des API Gateway-Dienstes ist.
- expiryLength: Die Ablaufzeit des JWT in Sekunden.
 Die Funktion erstellt ein JWT, signiert es mithilfe der privaten Schlüsseldatei und gibt das signierte JWT zurück. Java Python Go 
- Fügen Sie im aufrufenden Dienst die folgende Funktion hinzu, um das signierte JWT im Header Authorization: Bearerder Anfrage an die API zu senden:Java Python Go 
Wenn Sie eine Anfrage mit einem JWT senden, empfehlen wir aus Sicherheitsgründen, das Authentifizierungstoken in den Header Authorization: Bearer einzufügen. Beispiel:
curl --request POST \
  --header "Authorization: Bearer ${TOKEN}" \
  "${GATEWAY_URL}/echo"
Dabei sind GATEWAY_URL und TOKEN Umgebungsvariablen, die die bereitgestellte Gateway-URL bzw. das Authentifizierungstoken enthalten.
Authentifizierte Ergebnisse in Ihrer API empfangen
API Gateway leitet in der Regel alle empfangenen Header weiter. Der ESP überschreibt aber möglicherweise den ursprünglichen Authorization-Header, wenn die Backend-Adresse in der API-Konfiguration durch x-google-backend angegeben ist
API Gateway sendet das Authentifizierungsergebnis in X-Apigateway-Api-Userinfo an die Backend-API. Es wird empfohlen, diesen Header anstelle des ursprünglichen Authorization-Headers zu verwenden. Dieser Header ist base64url-codiert und enthält die JWT-Nutzlast.