Google-Authentifizierungserweiterung

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Version: 1.0.2

Authentifizieren Sie sich bei Google, um den Zugriff auf die von Ihnen angegebenen Google APIs zu erhalten.

Verwenden Sie diese Erweiterung, um ein Token (OAuth oder JWT) für Google Cloud-Dienste abzurufen, und verwenden Sie es dann für nachfolgende Aufrufe der Google API, z. B. mithilfe einer ServiceCallout-Richtlinie.

In einem API-Proxy können Sie beispielsweise ein Token mit dieser Erweiterung erhalten, das Token mithilfe der PopulateCache-Richtlinie im Cache speichern und das Token dann über die ServiceCallout-Richtlinie übergeben, um aus einem API-Proxy-Ablauf auf Google Cloud-Dienste zuzugreifen.

Voraussetzungen

In diesem Artikel erfahren Sie, wie Sie diese Erweiterung konfigurieren und verwenden. Bevor Sie die Erweiterung mithilfe der ExtensionCallout-Richtlinie von einem API-Proxy verwenden, müssen Sie Folgendes tun:

  1. Das von der Erweiterung verwendete Konto, also das Konto, das durch das Dienstkonto repräsentiert ist, das Sie für die Anmeldedaten verwenden, muss Zugriff auf die Google Cloud-Dienste zur Authentifizierung der Erweiterung haben.

  2. Generieren Sie mit der Google Cloud Console einen Schlüssel für das Dienstkonto.

  3. Verwenden Sie den Inhalt der resultierenden JSON-Datei mit dem Dienstkontoschlüssel, wenn Sie die Erweiterung mithilfe der Konfigurationsreferenz hinzufügen und konfigurieren.

Authentifizierung bei Google Cloud

Diese Erweiterung fordert die Authentifizierung von Google Cloud an, indem sie ein bestimmtes Mitglied repräsentiert, das in Ihrem Google Cloud-Projekt definiert ist. Verwenden Sie beim Konfigurieren dieser Erweiterung die JSON-Datei des Dienstkontos dieses Projektmitglieds.

Diese Erweiterung hat dann nur Zugriff auf die Ressourcen, für die das jeweilige Mitglied eine entsprechende Berechtigung hat. Mit anderen Worten: Eine erfolgreiche Authentifizierung durch diese Erweiterung hängt von einer Übereinstimmung zwischen den in der Google Cloud Console gewährten Berechtigungen und dem von der Erweiterung zur Laufzeit angeforderten Zugriff (über Bereiche oder Zielgruppe) ab.

Im Allgemeinen sind zur Authentifizierung für den Zugriff auf APIs über diese Erweiterung folgende Schritte erforderlich:

  1. Achten Sie darauf, dass das Mitgliedsdienstkonto, das diese Erweiterung repräsentiert, Zugriff auf die Google-Ressource hat, auf die Sie zugreifen möchten. Über die Cloud IAM-Seite (Cloud Identity and Access Management) in der Google Cloud Console können Sie dem Projektmitglied, das diese Erweiterung repräsentiert, Rollen zuweisen.

  2. Verwenden Sie beim Konfigurieren dieser Erweiterung die JSON-Datei des Dienstkontoschlüssels dieses Mitglieds.

  3. Wenn Sie eine ExtensionCallout-Richtlinie für die Verwendung dieser Erweiterung konfigurieren, fordern Sie nur die Authentifizierung für Ressourcen an, auf die Ihr Projektmitglied Zugriff hat.

Samples

Die folgenden Beispiele veranschaulichen, wie die Authentifizierung bei Google Cloud mithilfe der ExtensionCallout-Richtlinie erfolgt.

Zugriffstoken anfordern

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token zur Verwendung in Anfragen an die Cloud Translation API ab.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConnectorCallout async="false" continueOnError="true" enabled="true" name="Get-Access-Token">
    <DisplayName>Get Access Token</DisplayName>
    <Connector>google-auth</Connector>
    <Action>getOauth2AccessToken</Action>
    <Input><![CDATA[{
      "scope" : [
        "https://www.googleapis.com/auth/cloud-translation"
      ]
    }]]></Input>
    <Output>google.credentials</Output>
</ConnectorCallout>

Der Antwortwert sieht in etwa so aus:

{
  "access_token":"ya29.c.ElpSB...BMgkALBJ0kou-8",
  "token_type":"Bearer",
  "expiresInSec": 3600
}

Die folgende AssignMessage-Richtlinie ruft den Antwortwert aus der obigen ExtensionCallout-Richtlinie ab und kopiert ihn in die Antwortnutzlast. Dies kann bei der Fehlerbehebung hilfreich sein. In der Praxis möchten Sie das Token vielleicht nicht an den Client zurückgeben.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Retrieve-Auth-Token">
    <DisplayName>Retrieve Auth Token</DisplayName>
    <AssignTo type="response" createNew="false"/>
    <Set>
        <Payload contentType="application/json">{google.credentials.access_token}</Payload>
    </Set>
</AssignMessage>

Zugriffstoken im Cache speichern

Um unnötige Aufrufe zum Abrufen eines Tokens zu vermeiden, sollten Sie das erhaltene Token im Cache speichern. Bei nachfolgenden Aufrufen, die ein Token erfordern, ist das Abrufen des Tokens aus dem Apigee Edge-Cache schneller als das Abrufen eines neuen Tokens. Wenn das im Cache gespeicherte Token abläuft, rufen Sie ein neues Token ab und aktualisieren Sie den Cache damit.

Der folgende Code aus einem Beispiel-API-Proxy zeigt, wie ein im Cache gespeichertes Token festgelegt und verwendet wird, um die Google Translation API mit einer ServiceCallout-Richtlinie aufzurufen. Jedes hier aufgeführte Codebeispiel bezieht sich auf eine andere Richtlinie im Ablauf.

Die folgenden Richtlinien werden in der Reihenfolge ausgeführt, die im folgenden XML-Ablauf beschrieben wird:

  <Request>
    <!-- Attempt to get a token from the cache. -->
    <Step>
        <Name>Get-Cached-Auth-Token</Name>
    </Step>
    <!-- Only execute the following ExtensionCallout policy if the call to the
      cache couldn't retrieve a cached token. -->
    <Step>
        <Name>Google-Auth-Callout</Name>
        <Condition>lookupcache.Get-Cached-Auth-Token.cachehit is false</Condition>
    </Step>
    <!-- Only execute the following PopulateCache policy if the call to the
      cache couldn't retrieve a cached token. -->
    <Step>
        <Name>Cache-Auth-Token</Name>
        <Condition>lookupcache.Get-Cached-Auth-Token.cachehit is false</Condition>
    </Step>
    <!-- Use the ServiceCallout policy to call the translate API. -->
    <Step>
        <Name>Translate-Text</Name>
    </Step>
</Request>
  1. Mit der folgenden LookupCache-Richtlinie wird versucht, ein Token aus dem Cache abzurufen. Wenn das Token bereits abgerufen und im Cache gespeichert wurde, ruft diese Richtlinie es zur Verwendung durch den API-Proxy ab.

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <LookupCache async="false" continueOnError="false" enabled="true" name="Get-Cached-Auth-Token">
          <DisplayName>Get Cached Auth Token</DisplayName>
          <!-- Give cache key and scope to specify the entry for the cached token. -->
          <CacheKey>
              <Prefix/>
              <KeyFragment>gcp_translate_token_</KeyFragment>
          </CacheKey>
          <Scope>Exclusive</Scope>
          <!-- Assign the retrieved token (if any) to a variable, where it
           can be retrieved by policies. -->
          <AssignTo>cloud.translation.auth.token</AssignTo>
      </LookupCache>
    
  2. Wenn die Cache-Suche kein im Cache gespeichertes Token abruft, ruft die folgende ExtensionCallout-Richtlinie ein neues OAuth-Token ab, wobei die Google Cloud Translation API als Bereich für das Token angegeben wird. Google Cloud gibt ein gültiges Token zurück, wenn die Anmeldedaten des Dienstkontos, die beim Konfigurieren der Erweiterung Google-Auth-Callout verwendet werden, ein Projektmitglied sind, das Zugriff auf die API hat.

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <ConnectorCallout async="false" continueOnError="true" enabled="true" name="Google-Auth-Callout">
          <DisplayName>Google-Auth-Callout</DisplayName>
          <Connector>example-auth-extension</Connector>
          <Action>getOauth2AccessToken</Action>
          <Input><![CDATA[{
            "scope" : ["https://www.googleapis.com/auth/cloud-translation"]
          }]]></Input>
          <Output parsed="false">cloud.translation.auth.token</Output>
      </ConnectorCallout>
    
  3. Nachdem die ExtensionCallout-Richtlinie ein neues Token abgerufen hat, wird es von der PopulateCache-Richtlinie zur späteren Verwendung durch Richtlinien im API-Proxy zwischengespeichert.

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <PopulateCache async="false" continueOnError="false" enabled="true" name="Cache-Auth-Token">
          <DisplayName>Cache Auth Token</DisplayName>
          <Properties/>
          <!-- Set cache key information to specify a unique key for this entry. -->
          <CacheKey>
              <Prefix/>
              <KeyFragment>gcp_translate_token_</KeyFragment>
          </CacheKey>
          <Scope>Exclusive</Scope>
          <ExpirySettings>
              <TimeoutInSec>5</TimeoutInSec>
          </ExpirySettings>
          <!-- Get the token to cache from the variable where the ExtensionCallout put it. -->
          <Source>cloud.translation.auth.token</Source>
      </PopulateCache>
    

Aktionen

getOauth2AccessToken

Ruft ein OAuth 2.0-Zugriffstoken ab. Mit dieser Aktion können Sie das zweibeinige OAuth zwischen Ihrem API-Proxy und Google APIs unterstützen, wenn die Google APIs ein OAuth-Token erfordern.

Beim zweibeinigen OAuth wird mit dieser Erweiterungsaktion ein OAuth-Token abgerufen. Dazu wird die JSON-Datei eines Dienstkontos bei Google verwendet, wenn Sie die Erweiterung konfigurieren. Sobald diese Aktion das OAuth-Token abruft, kann Ihr API-Proxy das Token für Aufrufe an Google APIs verwenden, wodurch die APIs effektiv im Namen des Google-Dienstkontos aufgerufen werden.

Der Zugriff auf Google Cloud APIs wird über die Bereiche gefiltert, die unter OAuth 2.0-Bereiche für Google APIs aufgeführt sind.

Weitere Informationen zu Server-zu-Server-Interaktionen mit OAuth 2.0 finden Sie unter OAuth 2.0 für Server-zu-Server-Anwendungen verwenden.

Syntax

<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
  "scope" : [
    "scope1",
    "scope2"
  ]
}]]></Input>

Beispiel

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token zur Verwendung in Anfragen an die Cloud Translation API ab.

<Action>getOauth2AccessToken</Action>
<Input><![CDATA[{
    "scope" : [
      "https://www.googleapis.com/auth/cloud-translation"
  ]
}]]></Input>

Anfrageparameter

Parameter Beschreibung Typ Standard Erforderlich
Bereich Ein Array mit OAuth 2.0-Bereichen. Weitere Informationen zu Bereichen finden Sie unter OAuth 2.0-Bereiche für Google APIs. Array ["https://www.googleapis.com/auth/cloud-platform"] – gewährt Zugriff auf alle APIs, auf die das Dienstkonto Zugriff hat. Nein.

Antwort

Ein Objekt, das das Zugriffstoken, seinen Typ und sein Ablaufdatum in der folgenden Form enthält:

{
  "accessToken": "ewogICJ0eXB...C5jb20iCn0K",
  "token_type": "Bearer",
  "expiresInSec": 3600
}

Antwortattribute

Parameter Beschreibung Standard Erforderlich
accessToken OAuth 2.0-Zugriffstoken. Keine Ja
tokenType Tokentyp. Bearer Ja
expiresInSec Anzahl der Sekunden, bis das Token abläuft. 3.600 Ja

getJWTAccessToken

Ruft ein JWT-Zugriffstoken (JSON Web Token) ab. Sie können dieses Token zur Authentifizierung bei Google APIs verwenden, wenn für die aufzurufende API eine Dienstdefinition im GitHub-Repository für Google APIs veröffentlicht wurde.

Bei einigen Google APIs können Sie autorisierte API-Aufrufe mit einem signierten JWT direkt als Inhabertoken statt mit einem OAuth 2.0-Zugriffstoken ausführen. Wenn dies möglich ist, können Sie vermeiden, dass Sie vor einem API-Aufruf eine Netzwerkanfrage an den Autorisierungsserver von Google senden müssen.

Weitere Informationen zur Authentifizierung mit einem JWT-Zugriffstoken finden Sie unter OAuth 2.0 für Server-zu-Server-Anwendungen verwenden.

Syntax

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
    "audience" : "audience"
}]]></Input>

Beispiel: URL der Cloud Functions-Funktion

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token zur Verwendung in Anfragen an die Cloud Translation API ab.

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
  "audience" : "https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME"
}]]></Input>

Beispiel: Mit Cloud IAP gesicherte Client-ID

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token zur Verwendung in Anfragen an die Cloud Translation API ab.

<Action>getJWTAccessToken</Action>
<Input><![CDATA[{
  "audience" : "Cloud-IAP-secured-client-ID"
}]]></Input>

Anfrageparameter

Parameter Beschreibung Standard Erforderlich
audience Beabsichtigter Empfänger des Tokens. Dies kann eine mit Cloud IAP gesicherte Client-ID, eine Cloud Functions-URL usw. umfassen. Keine Ja

Antwort

{
  "accessToken": "token",
  "tokenType": "Bearer",
  "expiresInSec": 3600
}

Antwortattribute

Parameter Beschreibung Standard Erforderlich
accessToken Zugriffstoken. Keine Ja
tokenType Tokentyp. Bearer Ja
expiresInSec Ablauf in Sekunden. 3.600 Ja

Konfigurationsreferenz

Verwenden Sie Folgendes, wenn Sie diese Erweiterung zur Verwendung in API-Proxys konfigurieren und bereitstellen. Eine Anleitung zum Konfigurieren einer Erweiterung mit der Apigee-Konsole finden Sie unter Erweiterung hinzufügen und konfigurieren.

Häufige Erweiterungseigenschaften

Für jede Erweiterung sind die folgenden Eigenschaften vorhanden.

Attribut Beschreibung Standard Erforderlich
name Der Name, den Sie dieser Konfiguration der Erweiterung zuweisen. Ja
packageName Name des Erweiterungspakets, wie von Apigee Edge angegeben. Ja
version Versionsnummer für das Erweiterungspaket, von dem Sie eine Erweiterung konfigurieren. Ja
configuration Konfigurationswert speziell für die Erweiterung, die Sie hinzufügen. Weitere Informationen finden Sie unter Eigenschaften für dieses Erweiterungspaket. Ja

Eigenschaften dieses Erweiterungspakets

Geben Sie Werte für die folgenden Konfigurationseigenschaften an, die spezifisch für diese Erweiterung sind.

Property Beschreibung Standard Erforderlich
Anmeldedaten Bei Eingabe in die Apigee Edge-Konsole ist dies der gesamte Inhalt der JSON-Datei des Dienstkontoschlüssels. Wenn er über die Verwaltungs-API gesendet wird, ist er ein base64-codierter Wert, der aus der gesamten JSON-Datei mit dem Dienstkontoschlüssel generiert wird. Keine Ja