Associer des comptes avec OAuth

Le type d'association OAuth est compatible avec deux flux OAuth 2.0 standards dans l'industrie, les flux de code implicite et 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.

Implémenter l'association de compte OAuth

Configurer le projet

Pour configurer votre projet afin d'utiliser l'association OAuth, 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 à côté de Association de comptes.
  4. Dans la section Création de compte, sélectionnez Non, je souhaite uniquement autoriser la création de comptes sur mon site Web.
  5. Dans Type d'association, sélectionnez OAuth et Code d'autorisation.

  6. Dans Informations client:

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

Implémenter votre serveur OAuth

Une implémentation serveur OAuth 2.0 du flux avec code d'autorisation consiste en deux points de terminaison, que votre service met à disposition via HTTPS. Le premier point de terminaison est le point de terminaison d'autorisation, qui est chargé de rechercher ou d'obtenir le consentement des utilisateurs pour l'accès aux données. Le point de terminaison d'autorisation présente une UI de connexion aux utilisateurs qui ne sont pas déjà connectés et enregistre leur consentement pour l'accès demandé. Le deuxième point de terminaison est le point de terminaison d'échange de jetons, qui permet d'obtenir des chaînes chiffrées appelées jetons autorisant l'utilisateur de l'action à accéder à votre service.

Lorsque votre action doit appeler l'une des API de votre service, Google utilise ces points de terminaison ensemble pour obtenir l'autorisation de vos utilisateurs d'appeler ces API en leur nom.

Une session avec flux avec code d'autorisation OAuth 2.0 lancée par Google se déroule comme suit:

  1. Google ouvre votre point de terminaison d'autorisation dans le navigateur de l'utilisateur. Si le flux a commencé sur un appareil à commande vocale uniquement pour une action, Google transfère l'exécution sur un téléphone.
  2. L'utilisateur se connecte (s'il n'est pas déjà connecté) et autorise Google à accéder à ses données avec votre API s'il ne l'a pas déjà fait.

  3. Votre service crée un code d'autorisation et le renvoie à Google en redirigeant le navigateur de l'utilisateur vers Google à l'aide du code d'autorisation joint à la requête.

  4. Google envoie le code d'autorisation à votre point de terminaison d'échange de jetons, qui vérifie l'authenticité du code et renvoie un jeton d'accès et un jeton d'actualisation. Le jeton d'accès est un jeton de courte durée que votre service accepte comme identifiants pour accéder aux API. Le jeton d'actualisation est un jeton de longue durée que Google peut stocker et utiliser pour acquérir de nouveaux jetons d'accès lorsqu'ils expirent.

  5. Une fois que l'utilisateur a terminé le flux d'association de comptes, chaque requête ultérieure envoyée de l'Assistant à votre webhook de fulfillment contient un jeton d'accès.

Gérer les requêtes d'autorisation

Lorsque votre action doit effectuer l'association de comptes via un flux de code d'autorisation OAuth 2.0, Google redirige l'utilisateur vers votre point de terminaison d'autorisation avec une requête incluant les paramètres suivants:

Paramètres du point de terminaison d'autorisation
client_id L'ID client Google que vous avez enregistré auprès de Google
redirect_uri URL à laquelle vous envoyez la réponse à cette requête.
state Valeur comptable renvoyée à Google telle quelle dans l'URI de redirection.
scope Facultatif: ensemble de chaînes de champ d'application délimitées par des espaces spécifiant les données pour lesquelles Google demande une autorisation.
response_type Correspond à la chaîne code.

Par exemple, si votre point de terminaison d'autorisation est disponible à l'adresse https://myservice.example.com/auth, une requête peut se présenter comme suit:

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

Pour que votre point de terminaison d'autorisation gère les requêtes de connexion, procédez comme suit:

  1. Vérifiez que client_id correspond à l'ID client Google que vous avez enregistré auprès de Google et que redirect_uri correspond à l'URL de redirection fournie par Google pour votre service. Ces vérifications sont importantes pour éviter d'accorder l'accès à des applications clientes indésirables ou mal configurées.

    Si vous acceptez plusieurs flux OAuth 2.0, vérifiez également que response_type est défini sur code.

  2. Vérifiez si l'utilisateur est connecté à votre service. Si l'utilisateur n'est pas connecté, suivez la procédure de connexion ou d'inscription au service.

  3. Générez un code d'autorisation que Google utilisera pour accéder à votre API. Le code d'autorisation peut correspondre à n'importe quelle valeur de chaîne, mais il doit représenter de manière unique l'utilisateur, le client auquel le jeton est destiné et l'heure d'expiration du code. De plus, il ne doit pas être deviné. Vous émettez généralement des codes d'autorisation qui expirent au bout de 10 minutes environ.

  4. Vérifiez que l'URL spécifiée par le paramètre redirect_uri présente le format suivant :

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
    YOUR_PROJECT_ID correspond à l'ID indiqué sur la page Paramètres du projet de la console Actions.

  5. Redirigez le navigateur de l'utilisateur vers l'URL spécifiée par le paramètre redirect_uri. Incluez le code d'autorisation que vous venez de générer et la valeur d'état d'origine non modifiée lorsque vous effectuez une redirection en ajoutant les paramètres code et state. Voici un exemple de l'URL obtenue :

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Gérer les requêtes d'échange de jetons

Le point de terminaison d'échange de jetons de votre service est responsable de deux types d'échanges de jetons:

  • Échanger des codes d'autorisation contre des jetons d'accès et des jetons d'actualisation
  • Échanger des jetons d'actualisation contre des jetons d'accès

Les requêtes d'échange de jetons incluent les paramètres suivants:

Paramètres de point de terminaison d'échange de jetons
client_id Chaîne identifiant Google comme origine de la requête. Cette chaîne doit être enregistrée dans votre système en tant qu'identifiant unique de Google.
client_secret Chaîne secrète que vous avez enregistrée auprès de Google pour votre service.
grant_type Type de jeton échangé. authorization_code ou refresh_token.
code Lorsque la valeur est grant_type=authorization_code, il s'agit du code que Google a reçu de votre point de terminaison de connexion ou d'échange de jetons.
redirect_uri Lorsque grant_type=authorization_code, ce paramètre correspond à l'URL utilisée dans la requête d'autorisation initiale.
refresh_token Lorsque la valeur est grant_type=refresh_token, le jeton d'actualisation que Google a reçu du point de terminaison de votre échange de jetons.
Échanger des codes d'autorisation contre des jetons d'accès et des jetons d'actualisation

Une fois que l'utilisateur s'est connecté et que votre point de terminaison d'autorisation a renvoyé un code d'autorisation de courte durée à Google, Google envoie une requête au point de terminaison d'échange de jetons afin d'échanger le code d'autorisation contre un jeton d'accès et un jeton d'actualisation.

Pour ces requêtes, la valeur de grant_type est authorization_code, et la valeur de code correspond à la valeur du code d'autorisation que vous avez précédemment accordé à Google. Voici un exemple de requête d'échange de code d'autorisation contre un jeton d'accès et un jeton d'actualisation:

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

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI

Pour échanger des codes d'autorisation contre un jeton d'accès et un jeton d'actualisation, votre point de terminaison d'échange de jetons répond aux requêtes POST en exécutant les étapes suivantes:

  1. Vérifiez que client_id identifie l'origine de la requête comme une origine autorisée et que client_secret correspond à la valeur attendue.
  2. Effectuez les vérifications suivantes :
    • Le code d'autorisation est valide et n'a pas expiré, et l'ID client spécifié dans la requête correspond à l'ID client associé au code d'autorisation.
    • L'URL spécifiée par le paramètre redirect_uri est identique à la valeur utilisée dans la requête d'autorisation initiale.
  3. Si vous ne pouvez pas vérifier tous les critères ci-dessus, renvoyez une erreur HTTP 400 (Bad Request) avec {"error": "invalid_grant"} dans le corps.
  4. Sinon, générez un jeton d'actualisation et un jeton d'accès à l'aide de l'ID utilisateur du code d'autorisation. Ces jetons peuvent correspondre à n'importe quelle valeur de chaîne, mais ils doivent représenter de manière unique l'utilisateur et le client auxquels le jeton est destiné, et ils ne doivent pas être devinés. Pour les jetons d'accès, enregistrez également leur délai d'expiration (généralement une heure après son émission). Les jetons d'actualisation n'expirent pas.
  5. Renvoyez l'objet JSON suivant dans le corps de la réponse HTTPS :
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
    

Google stocke le jeton d'accès et le jeton d'actualisation pour l'utilisateur, et enregistre l'expiration du jeton d'accès. Lorsque le jeton d'accès expire, Google l'utilise pour en obtenir un nouveau à partir du point de terminaison de votre échange de jetons.

Échanger des jetons d'actualisation contre des jetons d'accès

Lorsqu'un jeton d'accès expire, Google envoie une requête au point de terminaison d'échange de jetons afin d'échanger un jeton d'actualisation contre un nouveau jeton d'accès.

Pour ces requêtes, la valeur de grant_type est refresh_token, et la valeur de refresh_token correspond à la valeur du jeton d'actualisation que vous avez précédemment accordé à Google. Voici un exemple de requête d'échange d'un jeton d'actualisation contre un jeton d'accès:

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

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Pour échanger un jeton d'actualisation contre un jeton d'accès, le point de terminaison de votre échange de jetons répond aux requêtes POST en exécutant les étapes suivantes:

  1. Vérifiez que client_id identifie l'origine de la requête comme étant Google et que client_secret correspond à la valeur attendue.
  2. Vérifiez que le jeton d'actualisation est valide et que l'ID client spécifié dans la requête correspond à l'ID client associé au jeton d'actualisation.
  3. Si vous ne pouvez pas vérifier tous les critères ci-dessus, renvoyez une erreur HTTP 400 (Bad Request) avec {"error": "invalid_grant"} dans le corps.
  4. Sinon, utilisez l'ID utilisateur du jeton d'actualisation pour générer un jeton d'accès. Ces jetons peuvent correspondre à n'importe quelle valeur de chaîne, mais ils doivent représenter de manière unique l'utilisateur et le client auxquels le jeton est destiné, et ils ne doivent pas être devinés. Pour les jetons d'accès, enregistrez également leur délai d'expiration (généralement une heure après son émission).
  5. Renvoyez l'objet JSON suivant dans le corps de la réponse HTTPS:
    {
    "token_type": "Porte",
    "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é dans votre base de données.