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.

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.

Handle account creation via Google Sign-In

When a user needs to create an account on your service, Google makes a request to your token exchange endpoint that specifies intent=create, as in the following example:

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]

The assertion parameter contains 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, which you can use to create a new account on your service.

To respond to account creation requests, your token exchange endpoint must 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.

Validate user information and create new account

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, prompt the user to link their existing account with their Google Account by responding to the request with an HTTP 401 error, specifying error=linking_error and the user's email address as the login_hint, as in the following example:

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

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

If neither condition is true, create a new user account using the information provided in the JWT. New accounts do not typically have a password set. It is recommended that you add Google Sign In to other platforms to enable users to log in via Google across the surfaces of your application. Alternatively, you can email the user a link that starts your password recovery flow to allow the user to set a password for signing in on other platforms.

When the creation is completed, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:

{
  "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.