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.

In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.

In the authorization code flow, you need two endpoints:

  • The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
  • The token exchange endpoint, which is responsible for two types of exchanges:
    1. Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
    2. Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.

Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.

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.

Automatische Verknüpfung verwenden

Nachdem der Nutzer deiner Aktion eingewilligt hat, um auf sein Google-Profil zuzugreifen, sendet eine Anfrage, die eine signierte Bestätigung der Identität des Google-Nutzers enthält. Die Assertion enthält Informationen wie die Google-Konto-ID, den Namen, und E-Mail-Adresse. Der für Ihr Projekt konfigurierte Tokenaustausch-Endpunkt für diese Anfrage.

Wenn das entsprechende Google-Konto bereits in Ihrem Authentifizierungssystem vorhanden ist, gibt der Endpunkt des Tokenaustauschs ein Token für den Nutzer zurück. Wenn das Google-Konto die mit einem vorhandenen Nutzer übereinstimmen, gibt der Endpunkt des Tokenaustauschs den Fehler user_not_found zurück.

Die Anfrage hat das folgende Format:

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

Der Endpunkt des Tokenaustauschs muss die folgenden Parameter verarbeiten können:

Parameter für Tokenendpunkt
grant_type Der Tokentyp, der ausgetauscht wird. Bei diesen Anfragen den Wert urn:ietf:params:oauth:grant-type:jwt-bearer hat.
intent Bei diesen Anfragen lautet der Wert des Parameters "get".
assertion Ein JSON Web Token (JWT), das eine signierte Assertion der Google der Identität des Nutzers. Das JWT enthält Informationen wie die Google Konto-ID, Name und E-Mail-Adresse
consent_code Optional: Falls vorhanden, ein einmaliger Code, der angibt, dass der Der Nutzer hat deiner Aktion die Einwilligung erteilt, auf die angegebenen Bereiche zuzugreifen.
scope Optional: Alle Bereiche, die Sie von Google so konfiguriert haben, dass sie von Nutzern angefordert wird.

Wenn Ihr Tokenaustausch-Endpunkt die Verknüpfungsanfrage empfängt, sollte er Folgendes ausführen: 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.

Prüfen, ob das Google-Konto bereits in Ihrem Authentifizierungssystem vorhanden ist

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 beiden Bedingungen zutrifft, hat sich der Nutzer bereits registriert und Sie können eine ein Zugriffstoken hinzufügen.

Wenn weder die Google-Konto-ID noch die in der Assertion angegebene E-Mail-Adresse mit einem Nutzer in Ihrer Datenbank übereinstimmt, hat sich dieser Nutzer noch nicht registriert. In diesem Fall der Tokenaustausch-Endpunkt mit einem HTTP 401-Fehler antworten, der error=user_not_found angibt, wie im folgenden Beispiel:

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

{
  "error":"user_not_found",
}
Wenn Google eine 401-Fehlerantwort mit dem Fehler user_not_found erhält, ruft den Endpunkt des Tokenaustauschs mit dem Wert des Parameters intent auf. Auf create festgelegt und ein ID-Token gesendet, das die Profilinformationen des Nutzers enthält mit der Anfrage.

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.