L'association du compte Google permet aux titulaires d'un compte Google de se connecter à vos services de manière rapide, transparente et sécurisée, et de partager des données avec Google.
Cette fonctionnalité active la connexion avec Google avec One Tap pour les utilisateurs qui ont déjà associé leur compte Google à votre service. Cela améliore l'expérience des utilisateurs, 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 association OAuth du compte Google est compatible avec le flux avec code d'autorisation OAuth 2.0. Votre implémentation OAuth doit inclure les points de terminaison suivants :
- point de terminaison d'autorisation pour gérer les requêtes d'autorisation.
- Point de terminaison du jeton pour gérer les requêtes de jetons d'accès et d'actualisation.
- point de terminaison userinfo pour récupérer les informations de base du compte qui sont présentées à l'utilisateur lors du processus de connexion au compte associé.
- Vous disposez d'une application Android.
Comment ça marche ?
Conditions préalables : l'utilisateur a déjà associé son compte Google à son compte dans votre service.
- Vous activez l'affichage des comptes associés pendant la procédure de connexion One Tap.
- L'utilisateur voit s'afficher l'invite de connexion avec One Tap avec une option lui permettant de se connecter à votre service avec son compte associé.
- Si l'utilisateur choisit de continuer avec le compte associé, Google envoie une requête 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.
- Vous échangez le code d'autorisation Google contre un jeton d'ID Google contenant des informations sur le compte Google de l'utilisateur.
- Une fois le flux terminé, votre application reçoit également un jeton d'ID que vous mettez en correspondance avec l'identifiant utilisateur du jeton d'ID reçu par votre serveur afin de connecter l'utilisateur à votre application.
![Connexion à un compte associé.](https://developers.google.com/static/identity/one-tap/android/images/linked-account-signin.png?authuser=0&hl=fr)
Implémenter la connexion à un compte associé dans votre application Android
Pour utiliser la connexion à un compte associé dans votre application Android, suivez les instructions du Guide d'implémentation pour Android.
Gérer les requêtes de code d'autorisation provenant de Google
Google envoie une requête POST au point de terminaison de votre jeton afin d'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 accordé le jeton d'accès à Google (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 fourni à Google |
client_secret |
Obligatoire : code secret du client que vous avez envoyé à Google |
access_token |
Obligatoire Jeton d'accès que vous avez envoyé à Google. Vous l'utiliserez pour obtenir le contexte de l'utilisateur |
grant_type |
La valeur obligatoire 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 en procédant comme suit:
- Vérifiez que le
access_token
a été accordé à Google, identifié par leclient_id
. - Répondez en envoyant 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 indiquant un succès
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 par l'un des codes d'erreur HTTP suivants:
HTTP Status Code | Corps | Description |
---|---|---|
400 | {"error": "invalid_request"} |
Il manque un paramètre dans la requête. Le serveur ne peut donc pas la traiter. Cette valeur peut également être renvoyée si la requête inclut un paramètre non pris en charge 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 ID client ou un code secret non valide) |
401 | {"error": "invalid_token"}
Inclure la question d'authentification "WWW-Authentication: Bearer" (authentification WWW : support) dans l'en-tête de réponse |
Le jeton d'accès partenaire n'est pas valide. |
403 | {"error": "insufficient_permission"}
Inclure la question d'authentification "WWW-Authentication: Bearer" (authentification WWW : support) dans l'en-tête de réponse |
Le jeton d'accès partenaire ne contient pas le ou 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 à 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 devrez é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 à partir de la page Identifiants de la console API. Il s'agit généralement de l'identifiant intitulé New Actions on Google App (Nouvelle application Actions on Google) |
client_secret |
Obligatoire : code secret du client obtenu à partir de la page Identifiants de la console API |
code |
Obligatoire : code d'autorisation envoyé dans la requête initiale |
grant_type |
Obligatoire Comme indiqué 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 émis par Google 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 Valider la réponse contient des informations sur le décodage et la validation de la réponse du jeton d'ID. |
expires_in |
Durée de vie restante du jeton d'accès en secondes |
refresh_token |
Un 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 de la 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" ethd
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.