Kontoverknüpfung mit Google Log-in

Google Log-in für Assistant bietet Nutzern und Entwicklern die einfachste und einfachste Möglichkeit, Konten zu verknüpfen und zu erstellen. Deine Aktion kann während einer Unterhaltung Zugriff auf das Google-Profil des Nutzers anfordern, einschließlich des Namens, der E-Mail-Adresse und des Profilbilds des Nutzers.

Die Profilinformationen können verwendet werden, um eine personalisierte User Experience in deiner Aktion zu erstellen. Wenn Sie Anwendungen auf anderen Plattformen haben und diese Google Log-in verwenden, können Sie auch ein vorhandenes Nutzerkonto finden und verknüpfen, ein neues Konto erstellen und einen direkten Kommunikationskanal für den Nutzer einrichten.

Für eine Kontoverknüpfung mit Google Log-in musst du den Nutzer um seine Einwilligung für den Zugriff auf sein Google-Profil bitten. Anschließend verwenden Sie die Informationen in seinem Profil, z. B. seine E-Mail-Adresse, um den Nutzer in Ihrem System zu identifizieren.

Google Log-in-Kontoverknüpfung implementieren

Führe die Schritte in den folgenden Abschnitten aus, um eine Google Log-in-Kontoverknüpfung zu deiner Aktion hinzuzufügen.

Projekt konfigurieren

So konfigurieren Sie Ihr Projekt für die Verwendung der Google Log-in-Kontoverknüpfung:

  1. Öffnen Sie die Actions Console und wählen Sie ein Projekt aus.
  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 Ja aus.
  5. Wählen Sie unter Art der Verknüpfung die Option Google Log-in aus.

  6. Öffnen Sie Client-Informationen und notieren Sie sich den Wert der von Google für Ihre Aktionen ausgegebenen Client-ID.

  7. Klicken Sie auf Speichern.

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.

Auf Profilinformationen im Back-End zugreifen

Nachdem der Nutzer Ihre Aktion für den Zugriff auf sein Google-Profil autorisiert hat, erhalten Sie ein Google-ID-Token, das in jeder nachfolgenden Anfrage an Ihre Aktion die Google-Profilinformationen des Nutzers enthält.

Damit Sie auf die Profilinformationen des Nutzers zugreifen können, müssen Sie zuerst das Token validieren und decodieren. Gehen Sie dazu so vor:

  1. Verwenden Sie zum Decodieren des Tokens eine JWT-Decodierungsbibliothek für Ihre Sprache und verwenden Sie die öffentlichen Schlüssel von Google (verfügbar im Format JWK oder PEM), um die Tokensignatur zu prüfen.
  2. Prüfen Sie, ob der Aussteller des Tokens (Feld iss im decodierten Token) https://accounts.google.com und die Zielgruppe (Feld aud im decodierten Token) dem Wert der von Google für Ihre Aktionen ausgegebenen Client-ID entspricht. Diese ist Ihrem Projekt in der Actions Console zugewiesen.

Im Folgenden finden Sie ein Beispiel für ein decodiertes Token:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The token's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Client ID assigned to your Actions project
  "iat": 233366400,         // Unix timestamp of the token's creation time
  "exp": 233370000,         // Unix timestamp of the token's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "locale": "en_US"
}

Wenn Sie die Actions on Google-Auftragsausführungsbibliothek für Node.js verwenden, übernimmt sie die Validierung und Decodierung des Tokens und gewährt Ihnen Zugriff auf den Profilinhalt, wie in den folgenden Code-Snippets gezeigt.

...
const app = conversation({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
...
// Invoked on successful completion of account linking flow, check if we need to
// create a Firebase user.
app.handle('linkAccount', async conv => {
  let payload = conv.headers.authorization;
  if (payload) {
  // Get UID for Firebase auth user using the email of the user
    const email = payload.email;
    if (!conv.user.params.uid && email) {
      try {
        conv.user.params.uid = (await auth.getUserByEmail(email)).uid;
      } catch (e) {
        if (e.code !== 'auth/user-not-found') {
          throw e;
        }
        // If the user is not found, create a new Firebase auth user
        // using the email obtained from Google Assistant
        conv.user.params.uid = (await auth.createUser({email})).uid;
      }
    }
  }
});

Datenzugriffsanfragen verarbeiten

Wenn Sie Datenzugriffsanfragen bearbeiten möchten, müssen Sie nur prüfen, ob der durch das Google-ID-Token geltend gemachte Nutzer bereits in Ihrer Datenbank vorhanden ist. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie prüfen können, ob in einer Firestore-Datenbank bereits Bestellungen für einen Nutzer vorhanden sind:

...
app.handle('Place_Order', async conv => {
  const order = conv.session.params.order;
  const userDoc = dbs.user.doc(conv.user.params.uid);
  const orderHistory = userDoc.collection("orderHistory");
  if (orderHistory) {
    // Order history exists, so the user already placed an order.
    // Update counter for order type.
    await orderHistory.doc(order).update({ count: admin.firestore.FieldValue.increment(1)});
  } else {
    // First order they place
    await orderHistory.doc(order).set({ option: order, count: 1});
    options.forEach(opt => {
      if (opt != order) {
        orderHistory.doc(opt).set({ option: opt, count: 0});
      }
    });
  }
  return conv.add(`Your ${order} has been placed. ` +
      'Thanks for using Boba Bonanza, see you soon!');
});