Association de comptes via l'association "simplifiée" de Google Sign-In basée sur OAuth

Le type d'association "Simplifiée" basée sur Google Sign-In ajoute Google Sign-In à l'association de compte basée sur OAuth. Cela permet aux utilisateurs Google de s'associer facilement par commande vocale, tout en permettant l'association de compte aux utilisateurs qui se sont inscrits à votre service avec une identité autre que Google.

Ce type d'association commence par Google Sign-In, qui vous permet de vérifier si les informations du profil Google de l'utilisateur existent dans votre système. Si ces informations sont introuvables dans votre système, un flux OAuth standard démarre. L'utilisateur peut également choisir de créer un compte avec les informations de son profil Google.

Figure 1: Une fois que votre action a accès au profil Google de l'utilisateur, vous pouvez l'utiliser pour trouver une correspondance pour l'utilisateur dans votre système d'authentification.

Pour effectuer une association de compte avec le type d'association simplifiée, procédez comme suit:

  1. Commencez par demander à l'utilisateur d'autoriser l'accès à son profil Google.
  2. Utilisez les informations de son profil pour identifier l'utilisateur.
  3. Si vous ne trouvez pas de correspondance pour l'utilisateur Google dans votre système d'authentification, le flux se poursuit selon que vous avez configuré votre projet Actions dans la console Actions pour autoriser la création de comptes utilisateur par commande vocale ou uniquement sur votre site Web.
    • Si vous autorisez la création de compte par commande vocale, validez le jeton d'ID reçu de Google. Vous pouvez ensuite créer un utilisateur en fonction des informations de profil contenues dans le jeton d'ID.
    • Si vous n'autorisez pas la création de compte par commande vocale, l'utilisateur est transféré vers un navigateur où il peut charger votre page d'autorisation et terminer le parcours de création de l'utilisateur.
Si vous autorisez la création de comptes par commande vocale et que vous ne trouvez pas de correspondance pour le profil Google dans votre système d'authentification, vous devez valider le jeton d'ID reçu de Google. Vous pouvez ensuite créer un utilisateur à partir des informations de profil contenues dans le jeton d'ID.
            Si vous n'autorisez pas la création de compte utilisateur par commande vocale, l'utilisateur est transféré vers un navigateur où il peut charger votre page d'autorisation et terminer le flux.
Figure 2. Représentation visuelle du parcours OAuth et Google Sign-In lorsque les informations d'un utilisateur sont introuvables dans votre système.

Permettre la création de compte par commande vocale

Si vous autorisez la création de comptes utilisateur par commande vocale, l'Assistant demande à l'utilisateur s'il souhaite effectuer les opérations suivantes:

  • créer un compte sur votre système à l'aide des informations de son compte Google ;
  • Connectez-vous à votre système d'authentification avec un autre compte s'il existe un compte autre que Google.

Nous vous recommandons d'autoriser la création de comptes par commande vocale si vous souhaitez minimiser les inconvénients du processus de création de compte. L'utilisateur ne doit quitter le flux vocal que s'il souhaite se connecter à l'aide d'un compte autre que Google existant.

Interdire la création de compte par commande vocale

Si vous avez interdit la création de compte utilisateur par commande vocale, l'Assistant ouvre l'URL du site Web que vous avez fourni pour l'authentification de l'utilisateur. Si l'interaction a lieu sur un appareil sans écran, l'Assistant redirige l'utilisateur vers un téléphone pour poursuivre le flux d'association de comptes.

Interdire la création est recommandée dans les cas suivants:

  • Vous ne voulez pas autoriser les utilisateurs qui ne possèdent pas de comptes Google à créer un compte utilisateur et qu'ils doivent s'associer à leurs comptes utilisateur existants dans votre système d'authentification. Par exemple, si vous proposez un programme de fidélité, vous pouvez vous assurer que l'utilisateur ne perd pas les points accumulés dans son compte existant.

  • Vous devez maîtriser entièrement le processus de création de compte. Par exemple, vous pouvez interdire la création si vous devez présenter vos conditions d'utilisation à l'utilisateur lors de la création du compte.

Implémenter l'association "Simplifiée" de Google Sign-In basée sur OAuth

Les comptes sont associés aux flux OAuth 2.0 standards dans l'industrie. Actions on Google est compatible avec les flux implicites et avec code d'autorisation.

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.

Configurer le projet

Pour configurer votre projet afin d'utiliser l'association rationalisée, procédez comme suit:

  1. Ouvrez la console Actions et sélectionnez le projet que vous souhaitez utiliser.
  2. Cliquez sur l'onglet Développer, puis sélectionnez Association de comptes.
  3. Activez le bouton bascule situé à côté de Association de comptes.
  4. Dans la section Création du compte, sélectionnez Oui.

  5. Dans Type d'association, sélectionnez OAuth et Google Sign-In et Implicit.

  6. Dans Informations client, procédez comme suit:

    • Attribuez une valeur au Client-ID émis par vos actions vers Google pour identifier les requêtes provenant de Google.
    • Insérez les URL de vos points de terminaison Autorisation et Token Exchange.
  7. Cliquez sur Enregistrer.

Implémenter votre serveur OAuth

为了支持 OAuth 2.0 隐式流程,您的服务会进行授权 端点。此端点负责 就数据访问征得用户同意。授权端点 向尚未登录的用户显示登录界面,并记录 同意所请求的访问。

当您的 Action 需要调用您的某项授权的 API 时,Google 会使用 此端点来获得用户许可,以在其上调用这些 API 。

由 Google 发起的典型 OAuth 2.0 隐式流会话具有以下特征: 以下流程:

  1. Google 会在用户的浏览器中打开您的授权端点。通过 如果用户尚未登录,则可以登录,并且授予 Google 访问 通过您的 API 访问其数据(如果尚未授予权限)。
  2. 您的服务会创建一个访问令牌并将其返回给 通过使用访问令牌将用户的浏览器重定向回 Google, 附件。
  3. Google 调用您的服务的 API,并使用 。您的服务会验证访问令牌是否向 Google 授予 访问 API 的授权,然后完成 API 调用。

处理授权请求

当您的 Action 需要通过 OAuth 2.0 隐式流程执行账号关联时, Google 会通过包含以下内容的请求将用户发送到您的授权端点: 以下参数:

授权端点参数
client_id 您分配给 Google 的客户 ID。
redirect_uri 此请求的响应发送到的网址。
state 将一个在 重定向 URI。
response_type 要在响应中返回的值的类型。对于 OAuth 2.0 隐式 则响应类型始终为 token

例如,如果您的授权端点可通过 https://myservice.example.com/auth 访问, 请求可能如下所示:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token

为了让授权端点能够处理登录请求,请执行以下步骤:

  1. 验证 client_idredirect_uri 值, 防止向意外或配置错误的客户端应用授予访问权限:

    • 确认 client_id 是否与您的客户端 ID 匹配 分配给 Google。
    • 确认 redirect_uri 指定的网址 参数的格式如下:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID项目设置页面上的 ID Actions 控制台界面。
  2. 检查用户是否已登录您的服务。如果用户未登录 中,完成服务的登录或注册流程。

  3. 生成 Google 将用于访问您的 API 的访问令牌。通过 访问令牌可以是任何字符串值,但必须唯一地表示 令牌对应的用户和客户端,且不得被猜到。

  4. 发送 HTTP 响应,将用户浏览器重定向到相应网址 由 redirect_uri 参数指定。添加所有 以下参数:

    • access_token:您刚刚生成的访问令牌
    • token_type:字符串 bearer
    • state:原始状态的未修改状态值 请求 以下是生成的网址示例:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google 的 OAuth 2.0 重定向处理程序将收到访问令牌并确认 state 值没有更改。在 Google 获得 访问令牌,则 Google 会将该令牌附加到后续调用 作为 AppRequest 的一部分添加到您的 Action。

Gérer l'association automatique

Une fois que l'utilisateur a autorisé votre action à accéder à son profil Google, Google envoie une requête contenant une assertion signée de l'identité de l'utilisateur Google. L'assertion contient des informations comme l'ID, le nom, et votre adresse e-mail. Le point de terminaison d'échange de jetons configuré pour votre projet gère cette demande.

Si le compte Google correspondant est déjà présent dans votre système d'authentification, le point de terminaison de votre échange de jetons renvoie un jeton pour l'utilisateur. Si le compte Google correspond à un utilisateur existant, le point de terminaison de votre échange de jetons renvoie une erreur user_not_found.

La demande se présente sous la forme suivante:

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

Le point de terminaison de votre échange de jetons doit pouvoir gérer les paramètres suivants:

Paramètres du point de terminaison du jeton
grant_type Type de jeton échangé. Pour ces requêtes, a pour valeur urn:ietf:params:oauth:grant-type:jwt-bearer.
intent Pour ces requêtes, la valeur de ce paramètre est "get".
assertion Jeton Web JSON (JWT, JSON Web Token) qui fournit une assertion signée du jeton Google l'identité de l'utilisateur. Le jeton JWT contient des informations incluant les identifiants Google ID du compte, nom et adresse e-mail.
consent_code Facultatif: code à usage unique indiquant que le paramètre L'utilisateur a autorisé votre action à accéder aux champs d'application spécifiés.
scope Facultatif: tous les champs d'application que vous avez configurés par Google pour qu'ils soient demandés aux utilisateurs.

Lorsque le point de terminaison de votre échange de jetons reçoit la demande d'association, il doit effectuer la suivantes:

验证和解码 JWT 断言

您可以使用适用于您语言的 JWT 解码库来验证和解码 JWT 断言。 使用 Google 的公钥(适用于 JWKPEM 格式)来验证令牌的 签名。

解码后,JWT 断言如以下示例所示:

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

除了验证令牌的签名之外,还要验证断言的颁发者 (iss 字段)为 https://accounts.google.com,且受众群体(aud 字段) 是分配给您的 Action 的客户端 ID。

Vérifier si le compte Google est déjà présent dans votre système d'authentification

Vérifiez si l'une des conditions suivantes est remplie:

  • L'ID de compte Google, qui se trouve dans le champ sub de l'assertion, se trouve dans votre base de données d'utilisateurs.
  • L'adresse e-mail indiquée dans l'assertion correspond à un utilisateur de votre base de données utilisateur.

Si l'une ou l'autre des conditions est remplie, l'utilisateur s'est déjà inscrit et vous pouvez émettre un un jeton d'accès.

Si ni l'ID du compte Google, ni l'adresse e-mail spécifiée dans la déclaration correspond à un utilisateur de votre base de données, cela signifie que l'utilisateur ne s'est pas encore inscrit. Dans ce cas, Le point de terminaison de l'échange de jetons doit renvoyer une erreur HTTP 401, spécifiant error=user_not_found, comme dans l'exemple suivant:

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

{
  "error":"user_not_found",
}
Lorsque Google reçoit la réponse d'erreur 401 avec l'erreur user_not_found, appelle le point de terminaison de votre échange de jetons avec la valeur du paramètre intent est défini sur create et envoie un jeton d'ID contenant les informations du profil de l'utilisateur. avec la demande.

Gérer la création de compte via Google Sign-In

Lorsqu'un utilisateur doit créer un compte sur votre service, Google effectue une à votre point de terminaison d'échange de jetons, qui spécifie intent=create, comme dans l'exemple suivant:

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]

Le paramètre assertion contient un jeton Web JSON (JWT) qui fournit une assertion signée de l'identité de l'utilisateur Google. Le jeton JWT contient des informations qui inclut l'ID, le nom et l'adresse e-mail du compte Google de l'utilisateur, que vous pouvez utiliser pour créer un nouveau compte sur votre service.

Pour répondre aux demandes de création de compte, le point de terminaison de votre échange de jetons doit les éléments suivants:

验证和解码 JWT 断言

您可以使用适用于您语言的 JWT 解码库来验证和解码 JWT 断言。 使用 Google 的公钥(适用于 JWKPEM 格式)来验证令牌的 签名。

解码后,JWT 断言如以下示例所示:

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

除了验证令牌的签名之外,还要验证断言的颁发者 (iss 字段)为 https://accounts.google.com,且受众群体(aud 字段) 是分配给您的 Action 的客户端 ID。

Valider les informations sur l'utilisateur et créer un compte

Vérifiez si l'une des conditions suivantes est remplie:

  • L'ID de compte Google, qui se trouve dans le champ sub de l'assertion, se trouve dans votre base de données d'utilisateurs.
  • L'adresse e-mail indiquée dans l'assertion correspond à un utilisateur de votre base de données utilisateur.

Si l'une des conditions est vraie, invitez l'utilisateur à associer son compte existant à son compte Google en répondant à la requête avec une erreur HTTP 401, en spécifiant error=linking_error et l'adresse e-mail de l'utilisateur en tant que login_hint, comme dans l'exemple suivant:

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

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

Si aucune condition n'est remplie, créez un nouveau compte d'utilisateur à l'aide des informations fournies dans le JWT. En règle générale, aucun mot de passe n'est défini pour les nouveaux comptes. Il est recommandé d'ajouter Google Sign-In aux autres plates-formes pour permettre aux utilisateurs de se connecter via Google sur toutes les surfaces de votre application. Vous pouvez également envoyer par e-mail à l'utilisateur un lien qui lance le processus de récupération de mot de passe pour lui permettre de définir un mot de passe pour se connecter sur d'autres plateformes.

Une fois la création terminée, émettez un jeton d'accès et qui renvoient les valeurs dans un objet JSON le corps de votre réponse HTTPS, comme dans l'exemple suivant:

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

Concevoir l'interface utilisateur vocale pour le flux d'authentification

Vérifier si l'utilisateur est validé et démarrer le flux d'association de compte

  1. Ouvrez votre projet Actions Builder dans la console Actions.
  2. Créez une scène pour lancer l'association de comptes dans votre action :
    1. Cliquez sur Scenes (Scènes).
    2. Cliquez sur l'icône d'ajout (+) pour ajouter une scène.
  3. Dans la scène que vous venez de créer, cliquez sur l'icône d'ajout pour Conditions.
  4. Ajoutez une condition qui vérifie si l'utilisateur associé à la conversation est un utilisateur validé. Si la vérification échoue, votre action ne peut pas associer de compte pendant la conversation. Elle doit alors fournir l'accès à des fonctionnalités qui ne nécessitent pas d'association de compte.
    1. Dans le champ Enter new expression, sous Condition, saisissez la logique suivante : user.verificationStatus != "VERIFIED"
    2. Sous Transition, sélectionnez une scène ne nécessitant pas d'association de compte ou une scène qui est le point d'entrée de la fonctionnalité Invité.

  1. Cliquez sur l'icône d'ajout pour Conditions.
  2. Ajoutez une condition pour déclencher un flux d'association de compte si l'utilisateur n'est associé à aucune identité.
    1. Dans le champ Enter new expression, sous Condition, saisissez la logique suivante : user.verificationStatus == "VERIFIED"
    2. Sous Transition, sélectionnez la scène système Association de comptes.
    3. Cliquez sur Enregistrer.

Après l'enregistrement, une nouvelle scène système d'association de comptes appelée <SceneName>_AccountLinking est ajoutée à votre projet.

Personnaliser la scène de l'association de comptes

  1. Sous Scenes (Scènes), sélectionnez la scène du système d'association de comptes.
  2. Cliquez sur Envoyer une invite et ajoutez une courte phrase pour expliquer à l'utilisateur pourquoi l'action doit accéder à son identité (par exemple, "Enregistrer vos préférences").
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur Si l'utilisateur a correctement associé ses comptes.
  2. Configurez le déroulement du flux si l'utilisateur accepte d'associer son compte. Par exemple, appelez le webhook pour traiter toute logique métier personnalisée requise et revenir à la scène d'origine.
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur Si l'utilisateur annule ou ignore l'association de comptes.
  2. Configurez le déroulement du flux si l'utilisateur n'accepte pas d'associer son compte. Par exemple, envoyez un message de confirmation et redirigez vers des scènes qui fournissent des fonctionnalités qui ne nécessitent pas d'association de compte.
  3. Cliquez sur Enregistrer.

  1. Sous Conditions, cliquez sur Si une erreur système ou réseau se produit.
  2. Configurez la manière dont le flux doit se dérouler si le flux d'association de comptes ne peut pas être terminé en raison d'erreurs système ou réseau. Par exemple, envoyez un message de confirmation et redirigez vers des scènes qui fournissent des fonctionnalités qui ne nécessitent pas d'association de compte.
  3. Cliquez sur Enregistrer.

Gérer les demandes d'accès aux données

Si la requête de l'Assistant contient un jeton d'accès, vérifiez d'abord que le jeton est valide et qu'il n'a pas expiré, puis récupérez le compte utilisateur associé au jeton dans votre base de données de comptes utilisateur.