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 Konten zu erstellen. Deine Aktion kann während einer Unterhaltung den Zugriff auf das Google-Profil anfordern, einschließlich des Namens, der E-Mail-Adresse und des Profilbilds.

Die Profilinformationen können verwendet werden, um in Ihrer Aktion eine personalisierte Nutzererfahrung zu schaffen. Wenn Sie Apps auf anderen Plattformen haben und diese Google Log-in verwenden, können Sie auch das Konto eines vorhandenen Nutzers suchen und verknüpfen, ein neues Konto erstellen und einen direkten Kanal zur Kommunikation mit dem Nutzer einrichten.

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

Google Log-in-Kontoverknüpfung implementieren

Folge den Schritten in den folgenden Abschnitten, um ein Google Log-in-Konto mit deiner Aktion zu verknüpfen.

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 Verknüpfungstyp die Option Google Log-in aus.

  6. Öffnen Sie Clientinformationen und notieren Sie sich den Wert der Client-ID, die von Google für Ihre Aktionen ausgestellt wurde.

  7. Klicken Sie auf Speichern.

Sprachbenutzeroberfläche für den Authentifizierungsvorgang entwickeln

Prüfe, ob der Nutzer bestätigt ist, und starte die Kontoverknüpfung

  1. Öffnen Sie das Actions Builder-Projekt in der Actions Console.
  2. Erstellen Sie eine neue Szene, um die Kontoverknüpfung in Ihrer Aktion zu starten:
    1. Klicken Sie auf Szenen.
    2. Klicke auf das Symbol Hinzufügen +, um eine neue Szene hinzuzufügen.
  3. Klicken Sie in der neu erstellten Szene auf das Symbol für 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 durchführen. Sie sollte wieder 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 Funktionen nur für Gäste ist.

  1. Klicken Sie auf das Symbol für Bedingungen.
  2. Fügen Sie eine Bedingung hinzu, die einen Kontoverknüpfungsvorgang auslöst, 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 Ihrem Projekt die neue Systemverknüpfung <SceneName>_AccountLinking hinzugefügt.

Kontoverknüpfungsszene anpassen

  1. Wählen Sie unter Szenen die Szene für das System zur Kontoverknüpfung aus.
  2. Klicken Sie auf Aufforderung senden und fügen Sie einen kurzen Satz hinzu, um dem Nutzer zu erklären, warum die Aktion auf seine Identität zugreifen muss (z. B. zum Speichern Ihrer Einstellungen).
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Wenn der Nutzer die Kontoverknüpfung abgeschlossen hat.
  2. Konfigurieren Sie, wie der Ablauf ausgeführt werden soll, wenn der Nutzer der Verknüpfung seines Kontos zustimmt. Sie können beispielsweise den Webhook aufrufen, um die erforderliche benutzerdefinierte Geschäftslogik zu verarbeiten und zur ursprünglichen Szene zurückzukehren.
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Wenn der Nutzer die Kontoverknüpfung aufhebt oder schließt.
  2. Konfigurieren Sie die Vorgehensweise, wenn der Nutzer nicht mit der Kontoverknüpfung einverstanden ist. Senden Sie beispielsweise eine Bestätigungsnachricht und leiten Sie zu Szenen weiter, die Funktionen erfordern, die keine Kontoverknüpfung erfordern.
  3. Klicken Sie auf Speichern.

  1. Klicken Sie unter Bedingungen auf Wenn ein System- oder Netzwerkfehler auftritt.
  2. Konfigurieren Sie, wie der Vorgang fortgesetzt werden soll, wenn die Kontoverknüpfung aufgrund von System- oder Netzwerkfehlern nicht abgeschlossen werden kann. Senden Sie beispielsweise eine Bestätigungsnachricht und leiten Sie zu Szenen weiter, die Funktionen erfordern, die keine Kontoverknüpfung erfordern.
  3. Klicken Sie auf Speichern.

Profilinformationen im Back-End aufrufen

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

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

  1. Verwende eine JWT-Decodierungsbibliothek für deine Sprache, um das Token zu decodieren, und verwende die öffentlichen Schlüssel von Google (im JWK-Format oder PEM-Format verfügbar), um die Signatur des Tokens zu überprüfen.
  2. Prüfen Sie, ob der Aussteller des Tokens (Feld iss im decodierten Token) den Wert https://accounts.google.com hat und dass die Zielgruppe (Feld aud im decodierten Token) den Wert von Client-ID, die von Google für Ihre Aktionen ausgestellt wurde lautet. Diese ist Ihrem Projekt in der Actions Console zugewiesen.

Hier 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 Fulfillment on Google Fulfillment-Bibliothek für Node.js verwenden, werden das Token für Sie validiert und decodiert. Sie erhalten dadurch 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;
      }
    }
  }
});

Anfragen für den Datenzugriff verarbeiten

Prüfen Sie dazu, ob der vom Google-ID-Token angegebene Nutzer bereits in Ihrer Datenbank vorhanden ist. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie prüfen können, ob Bestellungen für einen Nutzer bereits in einer Firestore-Datenbank 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!');
});