Connexion à un compte associé

L'association du compte Google permet aux titulaires d'un compte Google de se connecter à vos services de manière rapide, fluide et sécurisée, et de partager des données avec Google.

La fonctionnalité de connexion à un compte associé active la connexion One Tap avec Google pour les utilisateurs qui ont déjà associé leur compte Google à votre service. Les utilisateurs bénéficient ainsi d'une meilleure expérience de connexion, car ils peuvent se connecter en un clic, sans avoir à saisir à nouveau leur nom d'utilisateur et leur mot de passe. Cela réduit également le risque que les utilisateurs créent des comptes en double sur votre service.

Conditions requises

Pour implémenter la connexion à un compte associé, vous devez remplir les conditions suivantes:

  • Votre implémentation de l'association OAuth de compte Google est compatible avec le flux avec code d'autorisation OAuth 2.0. Votre mise en œuvre OAuth doit inclure les points de terminaison suivants: <ph type="x-smartling-placeholder">
  • Vous disposez d'une application Android.

Fonctionnement

Condition préalable : l'utilisateur a préalablement associé son compte Google à son compte sur votre service.

  1. Vous choisissez d'afficher les comptes associés pendant le processus de connexion avec One Tap.
  2. L'utilisateur voit une invite de connexion avec One Tap, lui offrant la possibilité de se connecter à votre service avec son compte associé.
  3. Si l'utilisateur choisit de continuer avec le compte associé, Google envoie une demande au point de terminaison de votre jeton pour enregistrer un code d'autorisation. La requête contient le jeton d'accès de l'utilisateur émis par votre service et un code d'autorisation Google.
  4. Vous échangez le code d'autorisation Google contre un jeton d'ID Google contenant des informations sur le compte Google de l'utilisateur.
  5. Votre application reçoit également un jeton d'ID une fois le flux terminé. Vous le comparez à l'identifiant utilisateur du jeton d'ID reçu par votre serveur afin de connecter l'utilisateur à votre application.
<ph type="x-smartling-placeholder">
</ph> Connexion à un compte associé. <ph type="x-smartling-placeholder">
</ph> Figure 1. Procédure de connexion à un compte associé. Si l'utilisateur dispose de plusieurs comptes connectés sur son appareil, un sélecteur de compte peut s'afficher. Il n'est redirigé vers la vue de connexion au compte associé que s'il sélectionne un compte associé.

Implémenter la fonctionnalité de connexion à un compte associé dans votre application Android

Pour utiliser la fonctionnalité de connexion avec un compte associé dans votre application Android, suivez les instructions du guide d'implémentation Android.

Gérer les requêtes de code d'autorisation de Google

Google envoie une requête POST au point de terminaison de votre jeton pour enregistrer un code d'autorisation que vous échangez contre le jeton d'ID de l'utilisateur. La requête contient le jeton d'accès de l'utilisateur et un code d'autorisation OAuth2 émis par Google.

Avant d'enregistrer le code d'autorisation, vous devez vérifier que vous avez attribué à Google le jeton d'accès identifié par le client_id.

Requête HTTP

Exemple de requête

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

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

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

Paramètres du point de terminaison du jeton
code Code d'autorisation Google OAuth2 obligatoire
client_id Obligatoire ID client que vous avez attribué à Google
client_secret Obligatoire Code secret du client que vous avez envoyé à Google
access_token Obligatoire. Jeton d'accès que vous avez émis à Google. Vous l'utiliserez pour obtenir le contexte de l'utilisateur
grant_type Obligatoire : La valeur DOIT être définie sur urn:ietf:params:oauth:grant-type:reciprocal

Le point de terminaison de votre échange de jetons doit répondre à la requête POST de la manière suivante:

  • Vérifiez que le access_token a été accordé à Google identifié par le client_id.
  • Répondre avec une réponse HTTP 200 (OK) si la requête est valide et que le code d'autorisation a bien été échangé contre un jeton d'ID Google, ou un code d'erreur HTTP si la requête n'est pas valide.

Réponse HTTP

Opération réussie

Renvoie le code d'état HTTP 200 OK

Exemple de réponse positive
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Erreurs

En cas de requête HTTP non valide, répondez avec l'un des codes d'erreur HTTP suivants:

HTTP Status Code Corps Description
400 {"error": "invalid_request"} Il manque un paramètre à la requête. Le serveur ne peut donc pas la traiter. Il peut également s'afficher si la requête inclut un paramètre non accepté ou répète un paramètre.
401 {"error": "invalid_request"} Échec de l'authentification du client (par exemple, si la requête contient un code secret ou un ID client non valide)
401 {"error": "invalid_token"}

Inclure "WWW-Authentication: Bearer" question d'authentification "auth" dans l'en-tête de réponse

Le jeton d'accès du partenaire n'est pas valide.
403 {"error": "insufficient_permission"}

Inclure "WWW-Authentication: Bearer" question d'authentification "auth" dans l'en-tête de réponse

Le jeton d'accès du partenaire ne contient pas les champs d'application nécessaires pour effectuer l'authentification OAuth réciproque
500 {"error": "internal_error"} Erreur du serveur

La réponse d'erreur doit contenir les champs suivants :

Champs de réponse d'erreur
error Obligatoire Chaîne d'erreur
error_description Description lisible de l'erreur
error_uri URI fournissant plus de détails sur l'erreur
Exemple de réponse pour l'erreur 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Échanger le code d'autorisation contre un jeton d'ID

Vous devez échanger le code d'autorisation que vous avez reçu contre un jeton d'ID Google contenant des informations sur le compte Google de l'utilisateur.

Pour échanger un code d'autorisation contre un jeton d'ID Google, appelez le point de terminaison https://oauth2.googleapis.com/token et définissez les paramètres suivants:

Champs des demandes
client_id Obligatoire. ID client obtenu sur la page Identifiants de la console API. Il s'agit généralement de l'identifiant nommé Nouvelle application Actions on Google.
client_secret Obligatoire. Code secret du client obtenu sur la page Identifiants de la console API
code Obligatoire : code d'autorisation envoyé dans la requête initiale
grant_type Obligatoire Comme défini dans la spécification OAuth 2.0, la valeur de ce champ doit être définie sur authorization_code.
Exemple de requête
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

Google répond à cette requête en renvoyant un objet JSON contenant un jeton d'accès de courte durée et un jeton d'actualisation.

La réponse contient les champs suivants :

Champs de réponse
access_token Jeton d'accès délivré par Google et envoyé par votre application pour autoriser une requête API Google
id_token Le jeton d'ID contient les informations du compte Google de l'utilisateur. La section Validate Response (Valider la réponse) contient des détails sur la manière de décoder et de valider la réponse du jeton d'ID.
expires_in Durée de vie restante du jeton d'accès en secondes
refresh_token Jeton que vous pouvez utiliser pour obtenir un nouveau jeton d'accès. Les jetons d'actualisation sont valides jusqu'à ce que l'utilisateur révoque l'accès
scope La valeur de ce champ est toujours définie sur "openid" pour le cas d'utilisation "Connexion à un compte associé"
token_type Type de jeton renvoyé. Pour le moment, la valeur de ce champ est toujours définie sur Bearer
Exemple de réponse
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


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

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Valider la réponse du jeton d'ID

Valider et décoder l'assertion JWT

Vous pouvez valider et décoder l'assertion JWT à l'aide d'un Bibliothèque de décodage JWT pour votre langage. Utilisez Clés publiques de Google, disponibles JWK ou formats PEM, à vérifier la signature du jeton.

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
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

En plus de vérifier la signature du jeton, vérifiez que l'assertion (champ iss) est https://accounts.google.com, que l'audience (champ aud) correspond à l'ID client qui vous a été attribué et que le jeton n'a pas expiré. (champ exp).

À l'aide des champs email, email_verified et hd, vous pouvez déterminer Google héberge les adresses e-mail et fait autorité pour celles-ci. Dans les cas où Google faisant autorité, l'utilisateur est actuellement connu comme étant le titulaire légitime du compte et vous pouvez ignorer le mot de passe ou d'autres méthodes d'authentification. Sinon, ces méthodes pour valider le compte avant de l'associer.

Cas dans lesquels Google fait autorité:

  • email comporte le suffixe @gmail.com. Il s'agit d'un compte Gmail.
  • email_verified est "true" et hd est défini. Il s'agit d'un compte G Suite.

Les utilisateurs peuvent créer un compte Google sans utiliser Gmail ni G Suite. Quand ? email ne contient pas de suffixe @gmail.com et hd est absent. Google ne l'est pas. faisant autorité et un mot de passe ou d'autres méthodes d'authentification sont recommandés pour l'utilisateur. email_verified peut également être défini sur "true", car Google a initialement validé utilisateur lors de la création du compte Google, quelle que soit la propriété du tiers compte de messagerie peut avoir changé depuis.