Kontoverknüpfung mit OAuth

Der Typ OAuth-Verknüpfung unterstützt zwei branchenübliche OAuth 2.0-Abläufe: den impliziten und den Autorisierungscode.

Im impliziten Codeablauf öffnet Google Ihren Autorisierungsendpunkt im Browser des Nutzers. Nach erfolgreicher Anmeldung geben Sie ein langlebiges Zugriffstoken an Google zurück. Dieses Zugriffstoken ist jetzt in jeder Anfrage enthalten, die von Assistant an Ihre Aktion gesendet wird.

Für den Autorisierungscodeablauf benötigen Sie zwei Endpunkte:

  • Der Endpunkt für die Autorisierung, der für die Darstellung der Anmelde-UI für Nutzer sorgt, die noch nicht angemeldet sind, und die Einwilligung zum angeforderten Zugriff in Form eines kurzlebigen Autorisierungscodes erfasst.
  • Der Endpunkt Tokenaustausch, der für zwei Arten von Austauschen verantwortlich ist:
    1. Tauscht einen Autorisierungscode gegen ein langlebiges Aktualisierungstoken und ein kurzlebiges Zugriffstoken aus. Dieser Austausch erfolgt, wenn der Nutzer die Kontoverknüpfung durchläuft.
    2. Tauscht ein langlebiges Aktualisierungstoken gegen ein kurzlebiges Zugriffstoken aus. Dieser Austausch findet statt, wenn Google ein neues Zugriffstoken benötigt, weil das abgelaufene Token abgelaufen ist.

Der implizite Codeablauf ist zwar einfacher zu implementieren, aber Google empfiehlt, dass mit dem impliziten Vorgang ausgestellte Zugriffstokens nie ablaufen, da die Verwendung des Tokenablaufs mit dem impliziten Vorgang den Nutzer zwingt, sein Konto noch einmal zu verknüpfen. Wenn Sie aus Sicherheitsgründen ein Token auslaufen müssen, sollten Sie stattdessen den Autorisierungscode-Ablauf verwenden.

OAuth-Kontoverknüpfung implementieren

Projekt konfigurieren

So konfigurieren Sie Ihr Projekt für die Verwendung von OAuth-Verknüpfungen:

  1. Öffnen Sie die Actions Console und wählen Sie das Projekt aus, das Sie verwenden möchten.
  2. Klicken Sie auf den Tab Entwickeln und wählen Sie Kontoverknüpfung aus.
  3. Aktivieren Sie den Schalter neben Kontoverknüpfung.
  4. Wählen Sie im Abschnitt Kontoerstellung die Option Nein, ich möchte die Kontoerstellung nur auf meiner Website zulassen aus.
  5. Wählen Sie unter Verknüpfungstyp die Option OAuth und den Autorisierungscode aus.

  6. Gehen Sie unter Kundeninformationen folgendermaßen vor:

    • Weisen Sie der Client-ID von Actions to Google einen Wert zu, um Anfragen von Google zu identifizieren.
    • Notieren Sie sich den Wert der von Google für Ihre Aktionen ausgegebenen Client-ID.
    • Fügen Sie die URLs für Ihre Autorisierungs- und Token-Austausch-Endpunkte ein.
  1. Klicken Sie auf Speichern.

OAuth-Server implementieren

Eine OAuth 2.0-Serverimplementierung des Autorisierungscode-Vorgangs besteht aus zwei Endpunkten, die Ihr Dienst über HTTPS zur Verfügung stellt. Der erste Endpunkt ist der Autorisierungsendpunkt, über den die Einwilligung der Nutzer zum Datenzugriff eingeholt wird. Der Autorisierungsendpunkt zeigt den noch nicht angemeldeten Nutzern eine Anmelde-UI an und zeichnet ihre Einwilligung in den angeforderten Zugriff auf. Der zweite Endpunkt ist der Endpunkt des Tokenaustauschs. Damit werden verschlüsselte Strings abgerufen, sogenannte Tokens, die den Aktionsnutzer zum Zugriff auf deinen Dienst autorisieren.

Wenn deine Aktion eine der APIs deines Dienstes aufrufen muss, verwendet Google diese Endpunkte zusammen, um von deinen Nutzern die Berechtigung zu erhalten, diese APIs in ihrem Namen aufzurufen.

Die von Google initiierte Sitzung für den OAuth 2.0-Vorgang mit Autorisierungscode weist den folgenden Ablauf auf:

  1. Google öffnet den Autorisierungsendpunkt im Browser des Nutzers. Wenn der Ablauf für eine Aktion auf einem sprachgesteuerten Gerät begann, würde Google die Ausführung auf ein Smartphone übertragen.
  2. Der Nutzer meldet sich an (sofern er nicht bereits angemeldet ist) und erteilt Google die Berechtigung, über Ihre API auf seine Daten zuzugreifen, sofern er dies noch nicht getan hat.

  3. Der Dienst erstellt einen Autorisierungscode und gibt ihn an Google zurück. Dazu wird der Browser des Nutzers mit dem an die Anfrage angehängten Autorisierungscode wieder zu Google weitergeleitet.

  4. Google sendet den Autorisierungscode an den Endpunkt des Tokenaustauschs, der die Authentizität des Codes überprüft und ein Zugriffstoken und ein Aktualisierungstoken zurückgibt. Das Zugriffstoken ist ein kurzlebiges Token, das Ihr Dienst als Anmeldedaten für den Zugriff auf APIs akzeptiert. Das Aktualisierungstoken ist ein langlebiges Token, das Google speichern und verwenden kann, um neue Zugriffstokens zu erhalten, wenn sie ablaufen.

  5. Nachdem der Nutzer den Kontoverknüpfungsvorgang abgeschlossen hat, enthält jede nachfolgende Anfrage, die von Assistant an den Auftragsausführungs-Webhook gesendet wird, ein Zugriffstoken.

Autorisierungsanfragen verarbeiten

Wenn deine Aktion eine Kontoverknüpfung über einen OAuth 2.0-Autorisierungscode-Vorgang durchführen muss, sendet Google den Nutzer mit einer Anfrage mit den folgenden Parametern an deinen Autorisierungsendpunkt:

Parameter für den Autorisierungsendpunkt
client_id Die Google-Client-ID, die Sie bei Google registriert haben.
redirect_uri Die URL, an die Sie die Antwort auf diese Anfrage senden.
state Ein Buchhaltungswert, der unverändert in der Weiterleitungs-URI an Google zurückgegeben wird.
scope Optional: Ein durch Leerzeichen getrennter Satz von Bereichsstrings, die die Daten angeben, für die Google die Autorisierung anfordert.
response_type Der String code.

Wenn Ihr Autorisierungsendpunkt beispielsweise unter https://myservice.example.com/auth verfügbar ist, könnte eine Anfrage so aussehen:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code

Führen Sie die folgenden Schritte aus, damit der Autorisierungsendpunkt Anmeldeanfragen verarbeiten kann:

  1. Prüfen Sie, ob die client_id mit der Google-Client-ID übereinstimmt, die Sie bei Google registriert haben, und ob redirect_uri mit der Weiterleitungs-URL übereinstimmt, die von Google für Ihren Dienst bereitgestellt wird. Diese Prüfungen sind wichtig, um zu verhindern, dass unbeabsichtigten oder falsch konfigurierten Client-Apps Zugriff gewährt wird.

    Wenn du mehrere OAuth 2.0-Abläufe unterstützt, achte darauf, dass response_type auf code gesetzt ist.

  2. Prüfen Sie, ob der Nutzer in Ihrem Dienst angemeldet ist. Wenn der Nutzer nicht angemeldet ist, führen Sie den Anmelde- oder Registrierungsvorgang für Ihren Dienst aus.

  3. Generieren Sie einen Autorisierungscode, mit dem Google auf Ihre API zugreift. Der Autorisierungscode kann ein beliebiger Stringwert sein. Er muss jedoch den Nutzer, den Client, für den das Token bestimmt ist, und die Ablaufzeit des Codes eindeutig darstellen. Außerdem darf er nicht erraten werden. In der Regel stellen Sie Autorisierungscodes aus, die nach etwa 10 Minuten ablaufen.

  4. Die durch den Parameter redirect_uri angegebene URL muss folgendes Format haben:

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
    YOUR_PROJECT_ID ist die ID auf der Seite Projekteinstellungen der Actions Console.

  5. Leite den Browser des Nutzers an die mit dem Parameter redirect_uri angegebene URL weiter. Binden Sie den gerade generierten Autorisierungscode und den ursprünglichen, unveränderten Statuswert ein, wenn Sie die Weiterleitung durch Anfügen der Parameter code und state anhängen. Hier ein Beispiel für die resultierende URL:

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Anfragen zum Tokenaustausch verarbeiten

Der Endpunkt des Tokenaustauschs Ihres Dienstes ist für zwei Arten von Tokenaustauschen zuständig:

  • Autorisierungscodes gegen Zugriffstokens und Aktualisierungstokens austauschen
  • Aktualisierungstokens gegen Zugriffstoken austauschen

Anfragen zum Tokenaustausch umfassen die folgenden Parameter:

Parameter für Endpunkt des Tokenaustauschs
client_id Ein String, der den Ursprung der Anfrage als Google identifiziert. Dieser String muss in Ihrem System als eindeutige Kennung von Google registriert sein.
client_secret Ein geheimer String, den Sie bei Google für Ihren Dienst registriert haben.
grant_type Die Art des Tokens, das ausgetauscht wird. Entweder authorization_code oder refresh_token.
code Bei grant_type=authorization_code der Code, den Google von Ihrem Anmelde- oder Tokenaustausch-Endpunkt erhalten hat.
redirect_uri Bei grant_type=authorization_code ist dieser Parameter die URL, die in der ersten Autorisierungsanfrage verwendet wird.
refresh_token Bei grant_type=refresh_token das Aktualisierungstoken, das Google von Ihrem Endpunkt für Tokenaustausch erhalten hat.
Autorisierungscodes gegen Zugriffstokens und Aktualisierungstokens austauschen

Nachdem sich der Nutzer angemeldet hat und Ihr Autorisierungsendpunkt einen kurzlebigen Autorisierungscode an Google zurückgibt, sendet Google eine Anfrage an Ihren Tokenaustausch-Endpunkt, um den Autorisierungscode gegen ein Zugriffstoken und ein Aktualisierungstoken auszutauschen.

Für diese Anfragen ist der Wert von grant_type authorization_code und der Wert von code ist der Wert des Autorisierungscodes, den Sie Google zuvor gewährt haben. Das folgende Beispiel zeigt eine Anfrage zum Austausch eines Autorisierungscodes gegen ein Zugriffstoken und ein Aktualisierungstoken:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI

Zum Austauschen von Autorisierungscodes gegen ein Zugriffstoken und ein Aktualisierungstoken antwortet der Endpunkt des Tokenaustauschs auf POST-Anfragen und führt die folgenden Schritte aus:

  1. Prüfen Sie, ob client_id den Ursprung der Anfrage als autorisierten Ursprung identifiziert und client_secret mit dem erwarteten Wert übereinstimmt.
  2. Prüfen Sie Folgendes:
    • Der Autorisierungscode ist gültig und nicht abgelaufen. Die in der Anfrage angegebene Client-ID stimmt mit der Client-ID überein, die dem Autorisierungscode zugeordnet ist.
    • Die durch den Parameter redirect_uri angegebene URL ist identisch mit dem Wert, der in der ersten Autorisierungsanfrage verwendet wurde.
  3. Wenn Sie nicht alle oben genannten Kriterien überprüfen können, geben Sie den Fehler „HTTP 400 Bad Request“ mit {"error": "invalid_grant"} als Text zurück.
  4. Andernfalls generieren Sie mit der Nutzer-ID aus dem Autorisierungscode ein Aktualisierungstoken und ein Zugriffstoken. Diese Tokens können ein beliebiger Stringwert sein. Sie müssen jedoch den Nutzer und den Client, für den das Token bestimmt ist, eindeutig und nicht erraten werden können. Notieren Sie sich bei Zugriffstokens auch die Ablaufzeit des Tokens (in der Regel eine Stunde nach Ausstellung des Tokens). Aktualisierungstokens laufen nicht ab.
  5. Geben Sie das folgende JSON-Objekt im Text der HTTPS-Antwort zurück:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
    

Google speichert das Zugriffstoken und das Aktualisierungstoken für den Nutzer und zeichnet den Ablauf des Zugriffstokens auf. Wenn das Zugriffstoken abläuft, verwendet Google das Aktualisierungstoken, um ein neues Zugriffstoken von Ihrem Tokenaustausch-Endpunkt abzurufen.

Aktualisierungstokens gegen Zugriffstoken austauschen

Wenn ein Zugriffstoken abläuft, sendet Google eine Anfrage an Ihren Endpunkt für den Tokenaustausch, um ein Aktualisierungstoken gegen ein neues Zugriffstoken auszutauschen.

Für diese Anfragen ist der Wert von grant_type refresh_token und der Wert von refresh_token ist der Wert des Aktualisierungstokens, das Sie Google zuvor gewährt haben. Das folgende Beispiel zeigt eine Anfrage zum Austausch eines Aktualisierungstokens gegen ein Zugriffstoken:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Um ein Aktualisierungstoken gegen ein Zugriffstoken auszutauschen, antwortet der Endpunkt für den Tokenaustausch auf POST-Anfragen und führt die folgenden Schritte aus:

  1. Prüfe, ob client_id den Ursprung der Anfrage als Google identifiziert und client_secret mit dem erwarteten Wert übereinstimmt.
  2. Prüfen Sie, ob das Aktualisierungstoken gültig ist und ob die in der Anfrage angegebene Client-ID mit der mit dem Aktualisierungstoken verknüpften Client-ID übereinstimmt.
  3. Wenn Sie nicht alle oben genannten Kriterien überprüfen können, geben Sie den Fehler „HTTP 400 Bad Request“ mit {"error": "invalid_grant"} als Text zurück.
  4. Andernfalls verwenden Sie die Nutzer-ID aus dem Aktualisierungstoken, um ein Zugriffstoken zu generieren. Diese Tokens können ein beliebiger Stringwert sein. Sie müssen aber den Nutzer und den Client, für den das Token bestimmt ist, eindeutig repräsentieren und dürfen nicht erraten werden. Notieren Sie sich bei Zugriffstokens auch die Ablaufzeit des Tokens (in der Regel eine Stunde nach Ausstellung des Tokens).
  5. Geben Sie im Text der HTTPS-Antwort das folgende JSON-Objekt zurück:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }

Die Sprach-Benutzeroberfläche für den Authentifizierungsablauf entwerfen

Prüfe, ob der Nutzer bestätigt ist, und starte den Vorgang zur Kontoverknüpfung

  1. Öffnen Sie Ihr Actions Builder-Projekt in der Actions Console.
  2. Erstelle eine neue Szene, um die Kontoverknüpfung in deiner Aktion zu starten:
    1. Klicken Sie auf Szenen.
    2. Klicken Sie auf das Symbol Hinzufügen (+), um eine neue Szene hinzuzufügen.
  3. Klicken Sie in der neu erstellten Szene auf das Symbol zum Hinzufügen von Bedingungen.
  4. Fügen Sie eine Bedingung hinzu, die prüft, ob der mit der Unterhaltung verknüpfte Nutzer ein bestätigter Nutzer ist. Wenn die Prüfung fehlschlägt, kann deine Aktion während der Unterhaltung keine Kontoverknüpfung vornehmen und sollte auf Funktionen zugreifen, für die keine Kontoverknüpfung erforderlich ist.
    1. Geben Sie im Feld Enter new expression unter Bedingung die folgende Logik ein: user.verificationStatus != "VERIFIED"
    2. Wählen Sie unter Übergang eine Szene aus, für die keine Kontoverknüpfung erforderlich ist, oder eine Szene, die der Einstiegspunkt für die Funktion nur für Gäste ist.

  1. Klicken Sie unter Conditions (Bedingungen) auf das Symbol zum Hinzufügen .
  2. Fügen Sie eine Bedingung hinzu, um einen Kontoverknüpfungsvorgang auszulösen, wenn der Nutzer keine verknüpfte Identität hat.
    1. Geben Sie im Feld Enter new expression unter Bedingung die folgende Logik ein: user.verificationStatus == "VERIFIED"
    2. Wählen Sie unter Umstellung die Systemszene Kontoverknüpfung aus.
    3. Klicken Sie auf Speichern.

Nach dem Speichern wird dem Projekt eine neue Systemszene zur Kontoverknüpfung mit dem Namen <SceneName>_AccountLinking hinzugefügt.

Szene für die Kontoverknüpfung anpassen

  1. Wählen Sie unter Szenen die Systemszene für die Kontoverknüpfung aus.
  2. Klicke auf Prompt senden und füge einen kurzen Satz hinzu, um dem Nutzer zu beschreiben, warum die Aktion auf seine Identität zugreifen muss (z. B. „Zum Speichern deiner Einstellungen“).
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Wenn der Nutzer die Kontoverknüpfung erfolgreich abschließt.
  2. Legen Sie fest, wie der Ablauf ausgeführt werden soll, wenn der Nutzer der Verknüpfung seines Kontos zustimmt. Rufen Sie beispielsweise den Webhook auf, um die erforderliche benutzerdefinierte Geschäftslogik zu verarbeiten und zurück zur ursprünglichen Szene zu wechseln.
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Wenn der Nutzer die Kontoverknüpfung aufhebt oder ablehnt.
  2. Legen Sie fest, wie der Ablauf ausgeführt werden soll, wenn der Nutzer der Verknüpfung seines Kontos nicht zustimmt. Sie können beispielsweise eine Bestätigungsnachricht senden und zu Szenen weiterleiten, die Funktionen bieten, für die keine Kontoverknüpfung erforderlich ist.
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Bei System- oder Netzwerkfehlern.
  2. Legen Sie fest, wie der Ablauf ausgeführt werden soll, wenn der Kontoverknüpfungsvorgang aufgrund von System- oder Netzwerkfehlern nicht abgeschlossen werden kann. Sie können beispielsweise eine Bestätigungsnachricht senden und zu Szenen weiterleiten, die Funktionen bieten, für die keine Kontoverknüpfung erforderlich ist.
  3. Klicken Sie auf Speichern.

Datenzugriffsanfragen verarbeiten

Wenn die Assistant-Anfrage ein Zugriffstoken enthält, prüfen Sie zuerst, ob das Zugriffstoken gültig (und nicht abgelaufen) ist, und rufen Sie dann das zugehörige Nutzerkonto aus der Datenbank ab.