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

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

Ce type d'association commence par Se connecter avec Google, ce qui vous permet de vérifier si les informations du profil Google de l'utilisateur existent dans votre système. Si les informations de l'utilisateur ne sont pas trouvées dans votre système, un flux OAuth standard commence. L'utilisateur peut également choisir de créer un compte avec les informations de son profil Google.

Image 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 associer un compte avec le type d'association simplifiée, suivez ces étapes générales :

  1. Demandez d'abord à 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 d'utilisateur Google correspondant 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 comptes par commande vocale, validez le jeton d'identité reçu de Google. Vous pouvez ensuite créer un utilisateur en fonction des informations de profil contenues dans le jeton d'identité.
    • Si vous n'autorisez pas la création de compte par commande vocale, l'utilisateur est redirigé vers un navigateur où il peut charger votre page d'autorisation et suivre le flux de création d'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'identité reçu de Google. Vous pouvez ensuite créer un utilisateur en fonction des informations de profil contenues dans le jeton d'identité.
            Si vous n'autorisez pas la création de comptes 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 flux OAuth et Google Sign-In lorsqu'aucune information sur l'utilisateur n'est trouvée dans votre système.

Créer un compte d'assistance 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 actions 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 si vous en avez déjà un qui n'est pas un compte Google.

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

Interdire la création de comptes par commande vocale

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

Il est recommandé de ne pas autoriser la création dans les cas suivants :

  • Vous ne souhaitez pas autoriser les utilisateurs disposant de comptes non Google à créer un compte utilisateur, mais plutôt à l'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 sur son compte existant.

  • Vous devez avoir le contrôle total du flux 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 compte Google Sign-in basée sur OAuth

Les comptes sont associés à l'aide de flux OAuth 2.0 standards dans le secteur. Actions on Google est compatible avec les flux implicites et avec code d'autorisation.

Dans le flux de code implicite, Google ouvre votre point de terminaison d'autorisation dans le navigateur de l'utilisateur. Une fois connecté, vous renvoyez un jeton d'accès de longue durée à Google. Ce jeton d'accès est désormais inclus dans chaque requête envoyée à l'action par l'Assistant.

Dans le flux de code d'autorisation, vous avez besoin de deux points de terminaison:

  • Le point de terminaison authorization, qui consiste à présenter l'interface de connexion aux utilisateurs qui ne sont pas déjà connectés et à enregistrer le consentement demandé pour l'accès demandé sous la forme d'un code d'autorisation temporaire.
  • Le point de terminaison d'échange de jetons, responsable de deux types d'échanges :
    1. Échange un code d'autorisation contre un jeton d'actualisation de longue durée et un jeton d'accès de courte durée. Cet échange se produit lorsque l'utilisateur suit la procédure d'association de comptes.
    2. Échange un jeton d'actualisation de longue durée contre un jeton d'accès de courte durée. Cet échange se produit lorsque Google a besoin d'un nouveau jeton d'accès, car celui-ci a expiré.

Bien que le flux de code implicite soit plus facile à mettre en œuvre, Google recommande que les jetons d'accès émis à l'aide du flux implicite n'expirent jamais, car l'expiration du jeton avec le flux implicite oblige l'utilisateur à associer de nouveau son compte. Si vous avez besoin d'un jeton expiré pour des raisons de sécurité, envisagez plutôt d'utiliser le flux de code d'autorisation.

Configurer le projet

Pour configurer votre projet afin qu'il utilise l'association simplifiée, procédez comme suit :

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

  5. Dans Type d'association, sélectionnez OAuth et Se connecter avec Google, puis Implicite.

  6. Dans Client Information (Informations sur le client), procédez comme suit :

    • Attribuez une valeur à ID client émis par vos Actions sur Google pour identifier les requêtes provenant de Google.
    • Insérez les URL de vos points de terminaison d'autorisation et d'échange de jetons.
  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:

Valider et décoder l'assertion JWT

Vous pouvez valider et décoder l'assertion JWT à l'aide d'une bibliothèque de décodage JWT pour votre langage. Utilisez les clés publiques de Google (disponibles dans JWK ou PEM) pour vérifier signature.

Une fois décodée, l'assertion JWT ressemble à l'exemple suivant:

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

En plus de vérifier la signature du jeton, vérifiez que l'émetteur de l'assertion (champ iss) est https://accounts.google.com et que l'audience (champ aud) est l'ID client attribué à votre action.

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:

Valider et décoder l'assertion JWT

Vous pouvez valider et décoder l'assertion JWT à l'aide d'une bibliothèque de décodage JWT pour votre langage. Utilisez les clés publiques de Google (disponibles dans JWK ou PEM) pour vérifier signature.

Une fois décodée, l'assertion JWT ressemble à l'exemple suivant:

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

En plus de vérifier la signature du jeton, vérifiez que l'émetteur de l'assertion (champ iss) est https://accounts.google.com et que l'audience (champ aud) est l'ID client attribué à votre action.

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érifiez si l'utilisateur est validé et lancez le processus 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 compte dans votre action :
    1. Cliquez sur Scènes.
    2. Cliquez sur l'icône Ajouter (+) pour ajouter une scène.
  3. Dans la scène que vous venez de créer, cliquez sur l'icône Ajouter  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 et doit revenir à l'accès aux 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 qui ne nécessite pas d'association de compte ou une scène qui constitue le point d'entrée de la fonctionnalité réservée aux invités.

  1. Cliquez sur l'icône Ajouter  pour Conditions.
  2. Ajoutez une condition pour déclencher un parcours d'association de compte si l'utilisateur n'a pas d'identité associée.
    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 compte.
    3. Cliquez sur Enregistrer.

Une fois l'enregistrement effectué, une scène de système d'association de compte appelée <SceneName>_AccountLinking est ajoutée à votre projet.

Personnaliser la scène d'association de comptes

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

  1. Sous Conditions, cliquez sur Si l'utilisateur associe son compte.
  2. Configurez la façon dont le flux doit se dérouler si l'utilisateur accepte d'associer son compte. Par exemple, appelez le webhook pour traiter toute logique métier personnalisée requise et revenez à la scène d'origine.
  3. Cliquez sur Enregistrer.

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

  1. Sous Conditions, cliquez sur En cas d'erreur système ou réseau.
  2. Configurez la façon dont le flux doit se dérouler si le flux d'association de compte ne peut pas être terminé en raison d'erreurs système ou réseau. Par exemple, envoyez un message de confirmation et redirigez l'utilisateur vers des scènes qui fournissent des fonctionnalités ne nécessitant pas l'association de comptes.
  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 d'accès est valide et n'a pas expiré, puis récupérez le compte utilisateur associé au jeton à partir de votre base de données de comptes utilisateur.