Kontoverknüpfung mit OAuth und Google Log-in (Dialogflow)

Beim Verknüpfungstyp OAuth und Google Log-in wird OAuth-basiertes Google Log-in mit Google Log-in kombiniert. Kontoverknüpfung. Google-Nutzern werden so nahtlose sprachbasierte Links zur Verfügung gestellt. Gleichzeitig wird die Kontoverknüpfung für Nutzer aktiviert, die sich bei Ihrem Dienst registriert haben. mit einer Nicht-Google-Identität verknüpft sind.

Dieser Verknüpfungstyp beginnt mit Google Log-in. Damit können Sie prüfen, ob die Google-Profilinformationen sind in Ihrem System vorhanden. Wenn die Informationen des Nutzers nicht in Ihrem System gefunden wird, beginnt ein Standard-OAuth-Ablauf. Der Nutzer kann auch ein neues Konto mit ihren Google-Profilinformationen erstellen.

<ph type="x-smartling-placeholder">
</ph>
Abbildung 1: Nachdem deine Aktion Zugriff auf das Google-Konto des Nutzers Profil, können Sie es verwenden, um eine Übereinstimmung für den Nutzer in Ihrem Authentifizierungssystem zu finden.

Um Kontoverknüpfungen mit OAuth und Google Log-in durchzuführen, folge diesen allgemeinen Schritte:

  1. Bitten Sie den Nutzer zuerst, seine Einwilligung für den Zugriff auf sein Google-Profil zu geben.
  2. Verwenden Sie die Informationen in ihrem Profil, um den Nutzer zu identifizieren.
  3. Wenn Sie in Ihrem Authentifizierungssystem keine Übereinstimmung für den Google-Nutzer finden können, Der Ablauf wird abhängig davon fortgesetzt, ob Sie Ihr Actions-Projekt konfiguriert haben in der Actions Console, um die Erstellung von Nutzerkonten per Sprachbefehl oder nur auf Ihrer Website.
    • Wenn du die Kontoerstellung per Sprachbefehl zulässt, musst du die ID validieren von Google erhalten haben. Sie können dann einen Nutzer basierend auf dem im ID-Token enthaltene Profilinformationen.
    • Wenn du die Kontoerstellung per Spracheingabe nicht zulässt, wird der Nutzer weitergeleitet zu einen Browser, in dem sie Ihre Autorisierungsseite laden und den Vorgang abschließen können Erstellungsprozess durchlaufen.
<ph type="x-smartling-placeholder">
</ph> Wenn Sie die Kontoerstellung per Spracheingabe zulassen und keine Übereinstimmung finden für
            Google-Profil in Ihrem Authentifizierungssystem müssen Sie
            Validieren Sie das von Google erhaltene ID-Token. Sie können dann eine
            User basierend auf den im ID-Token enthaltenen Profilinformationen.
            Wenn Sie die Erstellung von Nutzerkonten per Spracheingabe nicht zulassen,
            an einen Browser übertragen werden, wo sie Ihre Autorisierungsseite laden können.
            und schließen Sie den Vorgang ab.
Abbildung 2. Eine visuelle Darstellung von OAuth und Google Anmeldevorgang, wenn Nutzerinformationen nicht in Ihrem System gefunden werden.

Kontoerstellung per Spracheingabe unterstützen

Wenn Sie die Erstellung von Nutzerkonten per Sprachbefehl zulassen, fragt Assistant den Nutzer, ob möchte er Folgendes tun:

  • ein neues Konto in Ihrem System mit den Google-Kontoinformationen erstellen oder
  • Melde dich mit einem anderen Konto in deinem Authentifizierungssystem an, wenn das Konto des Empfängers ein nicht mit einem Google-Konto verknüpft ist.

Wir empfehlen, die Kontoerstellung per Spracheingabe zu erlauben, wenn Sie die die Kontoerstellung vereinfachen. Die Nutzenden müssen lediglich den Sprachfluss verlassen. Wenn er sich mit einem bestehenden Konto anmelden möchte, das kein Google-Konto ist.

Kontoerstellung per Spracheingabe nicht zulassen

Wenn Sie die Erstellung von Nutzerkonten per Sprachbefehl nicht zugelassen haben, öffnet Assistant die URL für die Website, die Sie für die Nutzerauthentifizierung angegeben haben. Wenn die Interaktion stattfindet, Auf einem Gerät ohne Bildschirm leitet Assistant den Nutzer zu einem Smartphone weiter um mit der Kontoverknüpfung fortzufahren.

Das Verhindern der Erstellung wird in folgenden Fällen empfohlen:

  • Nutzer, die kein Google-Konto haben, dürfen keine und möchten, dass eine Verknüpfung mit den vorhandenen Nutzerkonten in Ihrem Authentifizierungssystem erforderlich. Wenn Sie beispielsweise ein Treuepunkteprogramm anbieten, möchten Sie möglicherweise, dass der Nutzer die gesammelten Punkte nicht verliert, eines bestehenden Kontos.

  • Sie müssen bei der Kontoerstellung die volle Kontrolle haben. Zum Beispiel könnten Sie keine Erstellung zulassen, wenn Sie dem Nutzer Ihre Nutzungsbedingungen während Kontoerstellung.

<ph type="x-smartling-placeholder"></ph>

OAuth- und Google Log-in-Kontoverknüpfung implementieren

Konten sind mit branchenüblichen OAuth 2.0-Abläufen verknüpft. Actions on Google unterstützt implizite Abläufe und Vorgänge mit 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.

Projekt konfigurieren

So konfigurieren Sie Ihr Projekt für die Verwendung von OAuth und Google Log-in-Konto verknüpfen, gehen Sie so vor:

  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 Ja aus.

  5. Wählen Sie unter Verknüpfungstyp die Option OAuth & Google Log-in und Implizit:

  6. Gehen Sie unter Clientinformationen wie folgt vor:

    • Weisen Sie der Client-ID, die von Ihren Aktionen an Google ausgegeben wird einen Wert zu, um von Google stammen.
    • Fügen Sie die URLs für Ihre Autorisierungs- und Tokenaustausch-Endpunkte ein.
  7. Klicken Sie auf Speichern.

OAuth-Server implementieren

Ihr Dienst führt eine Autorisierung durch, um den impliziten OAuth 2.0-Vorgang zu unterstützen. Endpunkt verfügbar über HTTPS. Dieser Endpunkt ist für die Authentifizierung und Einholen der Einwilligung der Nutzer für den Datenzugriff Den Autorisierungsendpunkt Nutzern, die noch nicht angemeldet sind, wird eine Anmeldeoberfläche angezeigt und die Daten werden aufgezeichnet. Zustimmung zum angeforderten Zugriff geben.

Wenn deine Aktion eine der autorisierten APIs deines Dienstes aufrufen muss, verwendet Google an diesen Endpunkt, um die Berechtigung von Ihren Nutzern zu erhalten, diese APIs auf ihrem

Eine typische von Google initiierte Sitzung im impliziten OAuth 2.0-Vorgang hat den folgenden Ablauf:

  1. Google öffnet Ihren Autorisierungsendpunkt im Browser des Nutzers. Die Der Nutzer meldet sich an, wenn er noch nicht angemeldet ist, und gewährt Google Zugriff auf die Datei ihre Daten mit Ihrer API verwenden, sofern sie nicht bereits die Berechtigung erteilt haben.
  2. Ihr Dienst erstellt ein Zugriffstoken und gibt es an Google, indem der Browser des Nutzers mit dem Zugriffstoken zurück zu Google weitergeleitet wird an die Anfrage angehängt.
  3. Google ruft die APIs Ihres Dienstes auf und hängt das Zugriffstoken mit für jede Anfrage. Ihr Dienst überprüft, ob das Zugriffstoken Google autorisiert, auf die API zuzugreifen und dann den API-Aufruf abzuschließen.

Autorisierungsanfragen verarbeiten

Wenn deine Aktion die Kontoverknüpfung über einen impliziten OAuth2-Vorgang durchführen muss, Google sendet den Nutzer mit einer Anfrage, die Folgendes enthält, an Ihren Autorisierungsendpunkt folgende Parameter:

Parameter des Autorisierungsendpunkts
client_id Die Client-ID, die Sie Google zugewiesen haben.
redirect_uri Die URL, an die Sie die Antwort auf diese Anfrage senden.
state Buchhaltungswert, der unverändert an Google zurückgegeben wird Weiterleitungs-URI.
response_type Der Werttyp, der in der Antwort zurückgegeben werden soll. Für den impliziten OAuth 2.0-Code 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ühre die folgenden Schritte aus, damit der Autorisierungsendpunkt Anmeldeanfragen verarbeiten kann:

  1. Prüfen Sie die Werte client_id und redirect_uri, um So verhindern Sie, dass unbeabsichtigte oder falsch konfigurierte Client-Apps Zugriff gewährt werden:

    • Prüfen Sie, ob die client_id mit Ihrer Client-ID übereinstimmt die Google zugewiesen sind.
    • Prüfen Sie, ob die in redirect_uri angegebene URL hat das folgende Format:
      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 angemeldet haben, müssen Sie den Anmelde- bzw. Anmeldevorgang für den Dienst abschließen.

  3. Generieren Sie ein Zugriffstoken, das Google für den Zugriff auf Ihre API verwendet. Die Zugriffstoken kann ein beliebiger Stringwert sein, muss aber den Wert Nutzer und den Client, für den das Token bestimmt ist, und darf nicht erraten werden.

  4. Eine HTTP-Antwort senden, die den Browser des Nutzers an die URL weiterleitet redirect_uri wird angegeben. Schließen Sie alle folgende Parameter im URL-Fragment:

    • access_token: das Zugriffstoken, das Sie gerade generiert haben
    • token_type: der String bearer
    • state: der unveränderte Statuswert aus dem Original Anfrage Hier 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 für state nicht geändert hat. Nachdem Google eine Zugriffstoken für Ihren Dienst erhalten, hängt Google das Token an nachfolgende Aufrufe an. als Teil des AppRequest an Ihre Aktion.

Handle automatic linking

After the user gives your Action consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.

If the corresponding Google account is already present in your authentication system, your token exchange endpoint returns a token for the user. If the Google account doesn't match an existing user, your token exchange endpoint returns a user_not_found error.

The request has the following form:

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

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&consent_code=CONSENT_CODE&scope=SCOPES

Your token exchange endpoint must be able to handle the following parameters:

Token endpoint parameters
grant_type The type of token being exchanged. For these requests, this parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer.
intent For these requests, the value of this parameter is `get`.
assertion A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address.
consent_code Optional: When present, a one-time code that indicates that the user has granted consent for your Action to access the specified scopes.
scope Optional: Any scopes you configured Google to request from users.

When your token exchange endpoint receives the linking request, it should do the following:

JWT-Assertion validieren und decodieren

Sie können die JWT-Assertion mit einer JWT-Decodierungsbibliothek für Ihre Sprache validieren und decodieren. Verwenden Sie die öffentlichen Schlüssel von Google (verfügbar in JWK oder PEM-Format), um die Signatur.

Nach der Decodierung sieht die JWT-Assertion so aus:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion'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"
}

Zusätzlich zur Bestätigung der Signatur des Tokens muss der Aussteller der Assertion geprüft werden (Feld iss) https://accounts.google.com ist und die Zielgruppe (Feld aud) ist die Client-ID, die deiner Aktion zugewiesen ist.

Check if the Google account is already present in your authentication system

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If either condition is true, the user has already signed up and you can issue an access token.

If neither the Google Account ID nor the email address specified in the assertion matches a user in your database, the user hasn't signed up yet. In this case, your token exchange endpoint should reply with a HTTP 401 error, that specifies error=user_not_found, as in the following example:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"user_not_found",
}
When Google receives the 401 error response with a user_not_found error, Google calls your token exchange endpoint with the value of the intent parameter set to create and sending an ID token that contains the user's profile information with the request.

Kontoerstellung über Google Log-in durchführen

Wenn ein Nutzer bei Ihrem Dienst ein Konto erstellen muss, erstellt Google ein an Ihren Tokenaustausch-Endpunkt senden, der Folgendes angibt: intent=create, wie im folgenden Beispiel:

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

response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&consent_code=CONSENT_CODE&assertion=JWT[&NEW_ACCOUNT_INFO]

Der Parameter assertion enthält ein JSON-Webtoken (JWT), das eine signierte Bestätigung der Identität des Google-Nutzers. Das JWT enthält Informationen die die Google-Konto-ID, den Namen und die E-Mail-Adresse des Nutzers enthält, die Sie um ein neues Konto für Ihren Dienst zu erstellen.

Um auf Anfragen zur Kontoerstellung zu antworten, muss Ihr Endpunkt für den Tokenaustausch Folgendes tun Folgendes:

JWT-Assertion validieren und decodieren

Sie können die JWT-Assertion mit einer JWT-Decodierungsbibliothek für Ihre Sprache validieren und decodieren. Verwenden Sie die öffentlichen Schlüssel von Google (verfügbar in JWK oder PEM-Format), um die Signatur.

Nach der Decodierung sieht die JWT-Assertion so aus:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion'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"
}

Zusätzlich zur Bestätigung der Signatur des Tokens muss der Aussteller der Assertion geprüft werden (Feld iss) https://accounts.google.com ist und die Zielgruppe (Feld aud) ist die Client-ID, die deiner Aktion zugewiesen ist.

Nutzerinformationen validieren und neues Konto erstellen

Prüfen Sie, ob eine der folgenden Bedingungen erfüllt ist:

  • Die Google-Konto-ID, die Sie im Feld sub der Assertion finden, befindet sich in Ihrer Nutzerdatenbank.
  • Die E-Mail-Adresse in der Assertion stimmt mit einem Nutzer in Ihrer Nutzerdatenbank überein.

Wenn eine der Bedingungen zutrifft, fordern Sie den Nutzer auf, sein bestehendes Konto mit zu verknüpfen. mit einem HTTP 401-Fehler auf die Anfrage antworten und angeben, error=linking_error und die E-Mail-Adresse des Nutzers als login_hint, wie im folgendes Beispiel:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

Wenn keine der beiden Bedingungen zutrifft, erstellen Sie mithilfe der Informationen ein neues Nutzerkonto. die im JWT bereitgestellt werden. Für neue Konten wird normalerweise kein Passwort festgelegt. Es ist empfohlen, Google Log-in auf anderen Plattformen hinzuzufügen, damit sich Nutzer anmelden können über Google für alle Oberflächen Ihrer App verfügbar. Alternativ können Sie Senden Sie dem Nutzer per E-Mail einen Link, mit dem die Passwortwiederherstellung gestartet wird, damit der Nutzer ein Passwort für die Anmeldung auf anderen Plattformen.

Wenn die Erstellung abgeschlossen ist, geben Sie ein Zugriffstoken aus und geben die Werte in einem JSON-Objekt in den Text Ihrer HTTPS-Antwort ein, wie im folgenden Beispiel:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  
  "expires_in": SECONDS_TO_EXPIRATION
}

Authentifizierungsvorgang starten

Den Intent „Account Sign-in Helper“ (Kontoanmeldung) verwenden um den Authentifizierungsvorgang zu starten.

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Dialogflow (Node.js)
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'))
})
<ph type="x-smartling-placeholder">
</ph>
Dialogflow (Java)
private String clientId = "<your_client_id>";

@ForIntent("Start Signin")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
<ph type="x-smartling-placeholder">
</ph>
Actions SDK (Node.js)
const app = actionssdk({
  clientId: CLIENT_ID,
})

app.intent('Start Signin', conv => {
  conv.ask(new SignIn('To get your account details'))
})
<ph type="x-smartling-placeholder">
</ph>
Actions SDK (Java)
private String clientId = "<your_client_id>";

@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();
}

Datenzugriffsanfragen verarbeiten

Wenn die Assistant-Anfrage ein Zugriffstoken enthält, gehen Sie so vor: Prüfen Sie zuerst, ob das Zugriffstoken gültig und nicht abgelaufen ist, und rufen Sie es dann von Ihrem Nutzerkontodatenbank: Das mit dem Token verknüpfte Nutzerkonto.