Kontoverknüpfung mit OAuth (Dialogflow)

Der Verknüpfungstyp OAuth 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 der OAuth-Kontoverknüpfung:

  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 Implizit 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.
    • Fügen Sie die URLs für Ihre Autorisierungs- und Token-Austausch-Endpunkte ein.
  1. Klicken Sie auf Speichern.

OAuth-Server implementieren

Zur Unterstützung des impliziten OAuth 2.0-Vorgangs stellt Ihr Dienst einen Autorisierungsendpunkt über HTTPS zur Verfügung. Dieser Endpunkt ist für die Authentifizierung und das Einholen der Einwilligung von Nutzern in den Datenzugriff verantwortlich. Der Autorisierungsendpunkt stellt den noch nicht angemeldeten Nutzern eine Anmelde-UI bereit und zeichnet die Einwilligung für den angeforderten Zugriff auf.

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

Eine typische implizite OAuth 2.0-Vorgangssitzung, die von Google initiiert wird, sieht den folgenden Ablauf aus:

  1. Google öffnet den Autorisierungsendpunkt im Browser des Nutzers. Der Nutzer meldet sich an, sofern er noch nicht angemeldet ist, und erteilt Google die Berechtigung, über Ihre API auf seine Daten zuzugreifen, sofern er dies noch nicht getan hat.
  2. Ihr Dienst erstellt ein Zugriffstoken und gibt es an Google zurück, indem er den Browser des Nutzers wieder an Google weiterleitet, wobei das Zugriffstoken an die Anfrage angehängt ist.
  3. Google ruft die APIs Ihres Dienstes auf und hängt das Zugriffstoken an jede Anfrage an. Ihr Dienst überprüft, ob das Zugriffstoken Google die Autorisierung für den Zugriff auf die API gewährt, und führt dann den API-Aufruf aus.

Autorisierungsanfragen verarbeiten

Wenn deine Aktion eine Kontoverknüpfung über einen impliziten OAuth2-Vorgang vornehmen muss, sendet Google den Nutzer mit einer Anfrage mit den folgenden Parametern an deinen Autorisierungsendpunkt:

Parameter für den Autorisierungsendpunkt
client_id Die Client-ID, die Sie Google zugewiesen 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.
response_type Der Typ des Werts, der in der Antwort zurückgegeben werden soll. Für den impliziten OAuth 2.0-Vorgang ist der Antworttyp immer token.

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&response_type=token

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

  1. Prüfen Sie die Werte client_id und redirect_uri, um zu verhindern, dass Sie unbeabsichtigten oder falsch konfigurierten Client-Apps Zugriff gewähren:

    • Bestätige, dass die client_id mit der Client-ID übereinstimmt, die du Google zugewiesen hast.
    • 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.
  2. Prüfen Sie, ob der Nutzer in Ihrem Dienst angemeldet ist. Wenn der Nutzer nicht angemeldet ist, schließen Sie den Anmelde- oder Registrierungsvorgang für den Dienst ab.

  3. Generieren Sie ein Zugriffstoken, mit dem Google auf Ihre API zugreift. Das Zugriffstoken kann ein beliebiger Stringwert sein. Es muss jedoch den Nutzer und den Client eindeutig repräsentieren, für den das Token bestimmt ist, und darf nicht erraten werden.

  4. Es wird eine HTTP-Antwort gesendet, die den Browser des Nutzers an die mit dem Parameter redirect_uri angegebene URL weiterleitet. Füge alle folgenden Parameter in das URL-Fragment ein:

    • access_token: das soeben generierte Zugriffstoken
    • token_type: der String bearer
    • state: der unveränderte Statuswert aus der ursprünglichen Anfrage Im Folgenden finden Sie ein Beispiel für die resultierende URL:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Der OAuth 2.0-Weiterleitungs-Handler von Google empfängt das Zugriffstoken und bestätigt, dass sich der Wert state nicht geändert hat. Nachdem Google ein Zugriffstoken für deinen Dienst erhalten hat, hängt Google das Token als Teil der AppRequest an nachfolgende Aufrufe deiner Aktion an.

Authentifizierungsvorgang starten

Verwenden Sie den Hilfs-Intent für die Kontoanmeldung, um den Authentifizierungsvorgang zu starten. Die folgenden Code-Snippets beschreiben, wie in Dialogflow und im Actions SDK eine Antwort gesendet wird, um dieses Hilfsprogramm zu verwenden.

Dialogflow:

Node.js
const {dialogflow, SignIn} = require('actions-on-google');
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('Start Signin', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("Start Signin")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "PLACEHOLDER"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}",
      "systemIntent": {
        "intent": "actions.intent.SIGN_IN",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
          "optContext": "To get your account details"
        }
      }
    }
  },
  "outputContexts": [
    {
      "name": "/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{}"
      }
    }
  ]
}

Actions-SDK:

Node.js
const {actionssdk, SignIn} = require('actions-on-google');
const app = actionssdk({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('actions.intent.TEXT', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "PLACEHOLDER"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.SIGN_IN",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
            "optContext": "To get your account details"
          }
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

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.