Google-Authentifizierungserweiterung

Sie sehen sich die Dokumentation zu Apigee Edge an.
Sehen Sie sich die Apigee X-Dokumentation an.
info

Version: 2.0.0

Authentifizieren Sie sich bei Google, um auf die von Ihnen angegebenen Google APIs zuzugreifen.

Mit dieser Erweiterung können Sie ein Token (OAuth oder JWT) für Google Cloud-Dienste abrufen und dann für nachfolgende Aufrufe der Google API verwenden, z. B. mit einer ServiceCallout-Richtlinie.

In einem API-Proxy können Sie beispielsweise ein Token mit dieser Erweiterung abrufen, es mit der Richtlinie zum Ausfüllen des Caches im Cache speichern und dann über die ServiceCallout-Richtlinie übergeben, um innerhalb eines API-Proxy-Ablaufs auf Google Cloud-Dienste zuzugreifen.

Vorbereitung

Dieser Artikel enthält eine Referenz zum Konfigurieren und Verwenden dieser Erweiterung. Bevor Sie die Erweiterung über einen API-Proxy mit der ExtensionCallout-Richtlinie verwenden können, müssen Sie Folgendes tun:

  1. Das Konto, das von der Erweiterung verwendet wird (das Konto, das durch das Dienstkonto dargestellt wird, das Sie für die Anmeldedaten verwenden), muss Zugriff auf die Google Cloud-Dienste haben, mit denen sich die Erweiterung authentifizieren wird.

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

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

Authentifizierung mit Google Cloud

Diese Erweiterung fordert eine Authentifizierung bei Google Cloud an, indem sie ein bestimmtes in Ihrem Google Cloud-Projekt definiertes Mitglied darstellt. Sie verwenden die JSON-Datei des Dienstkontos dieses Projektmitglieds, um diese Erweiterung zu konfigurieren.

Daher hat diese Erweiterung nur Zugriff auf die Ressourcen, für die dieses Mitglied eine Berechtigung hat. Mit anderen Worten: Eine erfolgreiche Authentifizierung durch diese Erweiterung hängt davon ab, ob eine Übereinstimmung zwischen den in der Google Cloud Console gewährten Berechtigungen und dem Zugriff besteht, der von der Erweiterung zur Laufzeit (über Bereiche oder Zielgruppen) angefordert wird.

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

  1. Das Mitgliedskonto, das diese Erweiterung repräsentiert, muss Zugriff auf die Google-Ressource haben, auf die Sie zugreifen möchten. Auf der Seite „Cloud Identity and Access Management“ (Cloud IAM) in der Google Cloud Console können Sie dem Projektmitglied, das diese Erweiterung darstellt, Rollen zuweisen.

  2. Verwenden Sie beim Konfigurieren dieser Erweiterung den JSON-Schlüssel des Dienstkontos dieses Mitglieds.

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

Beispiele

In den folgenden Beispielen wird gezeigt, wie Sie sich mit der ExtensionCallout-Richtlinie bei Google Cloud authentifizieren.

Zugriffstoken anfordern

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token ab, das für Anfragen an die Cloud Translation API verwendet wird.

<?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. Das kann für die Fehlerbehebung nützlich sein. In der Praxis ist es jedoch nicht empfehlenswert, das Token an den Client zurückzugeben.

<?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, solltest du das empfangene Token im Cache speichern. Bei nachfolgenden Aufrufen, für die ein Token erforderlich ist, 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, rufe ein neues Token ab und aktualisiere den Cache damit.

Im folgenden Code aus einem Beispiel-API-Proxy wird gezeigt, wie Sie ein im Cache gespeichertes Token festlegen und verwenden, um die Google Translation API mit einer ServiceCallout aufzurufen. Jedes Codebeispiel hier bezieht sich auf eine andere Richtlinie im Ablauf.

Die folgenden Richtlinien werden in der durch die folgende Ablauf-XML-Datei beschriebenen Reihenfolge ausgeführt:

  <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. In der folgenden LookupCache-Richtlinie wird versucht, ein Token aus dem Cache abzurufen. Wenn das Token bereits abgerufen und im Cache gespeichert wurde, wird es mit dieser Richtlinie für die Verwendung durch den API-Proxy abgerufen.

      <?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 bei der Cachesuche kein gecachtes Token abgerufen wird, wird mit der folgenden ExtensionCallout-Richtlinie ein neues OAuth-Token abgerufen, wobei die Google Cloud Translation API als Gültigkeitsbereich für das Token angegeben wird. Google Cloud gibt ein gültiges Token zurück, wenn die Anmeldedaten des Dienstkontos, die beim Konfigurieren der Google-Auth-Callout-Erweiterung verwendet wurden, einem Projektmitglied mit Zugriff auf die API entsprechen.

      <?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 im Cache gespeichert, um später von Richtlinien im API-Proxy verwendet zu werden.

      <?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. Verwenden Sie diese Aktion, um OAuth mit zwei Schritten zwischen Ihrem API-Proxy und Google APIs zu unterstützen, wenn für die Google APIs ein OAuth-Token erforderlich ist.

Bei der OAuth-Dritt-Authentifizierung ruft diese Erweiterungsaktion ein OAuth-Token ab, indem sie sich mit Google über eine JSON-Datei für das Dienstkonto authentifiziert. Diese JSON-Datei fügen Sie hinzu, wenn Sie diese Erweiterung konfigurieren. Sobald das OAuth-Token abgerufen wurde, kann Ihr API-Proxy das Token verwenden, um Google APIs aufzurufen. Die APIs werden dann im Namen des Google-Dienstkontos aufgerufen.

Der Zugriff auf Google Cloud APIs wird anhand der in OAuth 2.0-Bereiche für Google APIs aufgeführten Bereiche gefiltert.

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 ab, das für Anfragen an die Cloud Translation API verwendet wird.

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

Anfrageparameter

Parameter Beschreibung Typ Standard Erforderlich
Bereich Ein Array von 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"], die Zugriff auf alle APIs gewährt, auf die das Dienstkonto Zugriff hat. Nein.

Antwort

Ein Objekt mit dem Zugriffstoken, seinem Typ und seinem Ablaufdatum im folgenden Format:

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

Antworteigenschaften

Parameter Beschreibung Standard Erforderlich
accessToken OAuth 2.0-Zugriffstoken. Keine Ja
tokenType Tokentyp Träger Ja
expiresInSec Anzahl der Sekunden bis zum Ablauf des Tokens. 3600 Ja

getJWTAccessToken

Ruft ein JSON Web Token (JWT)-Zugriffstoken ab. Sie können dieses Token verwenden, um sich bei Google APIs zu authentifizieren, wenn für die API, die Sie aufrufen möchten, eine Dienstdefinition im GitHub-Repository von Google APIs veröffentlicht wurde.

Bei einigen Google APIs können Sie autorisierte API-Aufrufe mit einem signierten JWT direkt als Inhabertoken anstelle eines OAuth 2.0-Zugriffstokens ausführen. So können Sie vermeiden, dass eine Netzwerkanfrage an den Autorisierungsserver von Google gesendet wird, bevor Sie einen API-Aufruf vornehmen.

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: Cloud Functions-URL

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token ab, das für Anfragen an die Cloud Translation API verwendet wird.

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

Beispiel: Cloud IAP-gesicherte Client-ID

Im folgenden Beispiel ruft die Aktion getOauth2AccessToken der Erweiterung ein Token ab, das für Anfragen an die Cloud Translation API verwendet wird.

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

Anfrageparameter

Parameter Beschreibung Standard Erforderlich
Zielgruppe Der beabsichtigte Empfänger des Tokens. Dazu kann eine Cloud IAP-geschützte Client-ID oder eine Cloud Functions-URL gehören. Keine Ja

Antwort

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

Antworteigenschaften

Parameter Beschreibung Standard Erforderlich
accessToken Zugriffstoken Keine Ja
tokenType Tokentyp Träger Ja
expiresInSec Ablaufzeit in Sekunden. 3600 Ja

Konfigurationsreferenz

Beachten Sie Folgendes, wenn Sie diese Erweiterung für die Verwendung in API-Proxys konfigurieren und bereitstellen. Eine Anleitung zum Konfigurieren einer Erweiterung mit der Apigee Console finden Sie unter Erweiterung hinzufügen und konfigurieren.

Gängige 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

Properties für dieses Erweiterungspaket

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

Attribut Beschreibung Standard Erforderlich
Anmeldedaten Wenn Sie diesen Wert in die Apigee Edge-Konsole eingeben, entspricht er dem gesamten Inhalt der JSON-Schlüsseldatei Ihres Dienstkontos. Wenn er über die Verwaltungs-API gesendet wird, ist er ein base64-codierter Wert, der aus der gesamten JSON-Schlüsseldatei des Dienstkontos generiert wird. Keine Ja