Présentation
L'association simplifiée avec Se connecter avec Google basée sur OAuth ajoute Se connecter avec Google en plus de l'association OAuth. Cela permet aux utilisateurs Google de bénéficier d'une expérience d'association fluide et de créer un compte sur votre service à l'aide de leur compte Google.
Pour associer un compte avec OAuth et Se connecter avec Google, procédez comme suit :
- Demandez d'abord à l'utilisateur d'autoriser l'accès à son profil Google.
- Utilisez les informations de son profil pour vérifier si le compte utilisateur existe.
- Pour les utilisateurs existants, associez les comptes.
- Si vous ne trouvez pas d'utilisateur Google correspondant dans votre système d'authentification, 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é.
Figure 1 : Association de compte sur le téléphone d'un utilisateur avec l'association simplifiée
Association simplifiée : flux OAuth + Se connecter avec Google
Le diagramme de séquence suivant détaille les interactions entre l'utilisateur, Google et votre point de terminaison d'échange de jetons pour l'association simplifiée.
Rôles et responsabilités
Le tableau suivant définit les rôles et responsabilités des acteurs du flux d'association simplifiée.
| Acteur / Composant | Rôle dans la LAG | Responsabilités |
|---|---|---|
| Application / Serveur Google | Client OAuth | Obtient le consentement de l'utilisateur pour Se connecter avec Google, transmet les assertions d'identité (JWT) à votre serveur et stocke de manière sécurisée les jetons obtenus. |
| Votre point de terminaison d'échange de jetons | Fournisseur d'identité / Serveur d'autorisation | Valide les assertions d'identité, recherche les comptes existants, gère les intents d'association de compte (check, get, create) et émet des jetons en fonction des intents demandés. |
| Votre API Service | Serveur de ressources | Fournit l'accès aux données utilisateur lorsqu'un jeton d'accès valide est présenté. |
Conditions requises pour l'association simplifiée
- Implémentez le flux d'association OAuth Web de base. Votre service doit être compatible avec les points de terminaison d'autorisation et d'échange de jetons conformes à OAuth 2.0.
- Votre point de terminaison d'échange de jetons doit être compatible avec les assertions JSON Web Token (JWT) et implémenter les intents
check,createetget.
Implémenter votre serveur OAuth
Votre point de terminaison d'échange de jetons doit être compatible avec les intents check, create et get.
Suivez ces étapes pour finaliser le flux d'association de comptes et découvrir quand les différents intents sont utilisés :
- L'utilisateur dispose-t-il d'un compte dans votre système d'authentification ? (L'utilisateur décide en sélectionnant OUI ou NON)
- OUI : l'utilisateur se connecte-t-il à votre plate-forme avec l'adresse e-mail associée à son compte Google ? (L'utilisateur décide en sélectionnant OUI ou NON)
- OUI : l'utilisateur dispose-t-il d'un compte correspondant dans votre système d'authentification ? (
check intentest appelé pour confirmation)- OUI :
get intentest appelé et le compte est associé si l'intention de récupération est renvoyée avec succès. - NON : Créer un compte ? (L'utilisateur décide en sélectionnant OUI ou NON)
- OUI :
create intentest appelé et le compte est associé si l'intention de création est renvoyée avec succès. - NON : le flux OAuth Web est déclenché, l'utilisateur est redirigé vers son navigateur et il a la possibilité d'associer un autre e-mail.
- OUI :
- OUI :
- NON : le flux OAuth Web est déclenché, l'utilisateur est redirigé vers son navigateur et il a la possibilité d'associer un autre e-mail.
- OUI : l'utilisateur dispose-t-il d'un compte correspondant dans votre système d'authentification ? (
- NON : l'utilisateur dispose-t-il d'un compte correspondant dans votre système d'authentification ? (
check intentest appelé pour confirmation)- OUI :
get intentest appelé et le compte est associé si l'intention de récupération est renvoyée avec succès. - NON :
create intentest appelé et le compte est associé si l'intention de création est renvoyée avec succès.
- OUI :
- OUI : l'utilisateur se connecte-t-il à votre plate-forme avec l'adresse e-mail associée à son compte Google ? (L'utilisateur décide en sélectionnant OUI ou NON)
Rechercher un compte utilisateur existant (vérifier l'intent)
Une fois que l'utilisateur a autorisé l'accès à son profil Google, Google lui envoie une requête contenant une assertion signée de l'identité de l'utilisateur Google. La contient des informations comme l'ID du compte Google de l'utilisateur, votre nom et votre adresse e-mail. Le point de terminaison d'échange de jetons configuré pour votre le projet traite cette demande.
Si le compte Google correspondant est déjà présent dans votre authentification
votre point de terminaison d'échange de jetons renvoie account_found=true. Si le
Le compte Google ne correspond à aucun utilisateur existant, le point de terminaison de votre échange de jetons
renvoie une erreur HTTP 404 Not Found avec account_found=false.
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=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
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 | |
|---|---|
intent |
Pour ces requêtes, la valeur de ce paramètre est
check |
grant_type |
Type de jeton échangé. Pour ces requêtes,
a pour valeur urn:ietf:params:oauth:grant-type:jwt-bearer. |
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 qui incluent le jeton ID, nom et adresse e-mail du compte Google. |
client_id |
ID client que vous avez attribué à Google. |
client_secret |
Code secret du client que vous avez attribué à Google. |
Pour répondre aux requêtes d'intent check, le point de terminaison de votre échange de jetons doit procéder comme suit:
- Validez et décodez l'assertion JWT.
- Vérifiez si le compte Google est déjà présent dans votre système d'authentification.
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é:
emailcomporte le suffixe@gmail.com. Il s'agit d'un compte Gmail.email_verifiedest "true" ethdest 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.
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
subde l'assertion, se trouve dans votre compte utilisateur base de données. - 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, l'utilisateur s'est déjà inscrit. Dans ce cas, renvoyer une réponse semblable à celle-ci:
HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8
{
"account_found":"true",
}
Si ni l'ID de compte Google, ni l'adresse e-mail spécifiée dans le champ
correspond à un utilisateur de votre base de données, l'utilisateur ne s'est pas encore inscrit. Dans
Dans ce cas, le point de terminaison de votre échange de jetons doit renvoyer une erreur HTTP 404
qui spécifie "account_found": "false", comme dans l'exemple suivant:
HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8
{
"account_found":"false",
}
Handle automatic linking (get intent)
After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.
If the corresponding Google Account is already present in your authentication
system, your token exchange endpoint returns a token for the user. If the
Google Account doesn't match an existing user, your token exchange endpoint
returns a linking_error error and optional login_hint.
The request has the following form:
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&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Your token exchange endpoint must be able to handle the following parameters:
| Token endpoint parameters | |
|---|---|
intent |
For these requests, the value of this parameter is get. |
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address. |
scope |
Optional: Any scopes that you've configured Google to request from users. |
client_id |
The client ID you assigned to Google. |
client_secret |
The client secret you assigned to Google. |
To respond to the get intent requests, your token exchange endpoint must perform the following steps:
- Validate and decode the JWT assertion.
- Check if the Google account is already present in your authentication system.
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é:
emailcomporte le suffixe@gmail.com. Il s'agit d'un compte Gmail.email_verifiedest "true" ethdest 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.
Check if the Google account is already present in your authentication system
Check whether either of the following conditions are true:
- The Google Account ID, found in the assertion's
subfield, is in your user database. - The email address in the assertion matches a user in your user database.
If an account is found for the user, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
In some cases, account linking based on ID token might fail for the user. If it
does so for any reason, your token exchange endpoint needs to reply with a HTTP
401 error that specifies error=linking_error, as the following example shows:
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
When Google receives a 401 error response with linking_error, Google sends
the user to your authorization endpoint with login_hint as a parameter. The
user completes account linking using the OAuth linking flow in their browser.
Gérer la création de compte avec Se connecter avec Google (intent "create")
Lorsqu'un utilisateur doit créer un compte sur votre service, Google envoie une requête à votre point de terminaison d'échange de jetons qui spécifie intent=create.
La requête se présente comme suit :
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&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Votre point de terminaison d'échange de jetons doit pouvoir gérer les paramètres suivants :
| Paramètres du point de terminaison du jeton | |
|---|---|
intent |
Pour ces requêtes, la valeur de ce paramètre est create. |
grant_type |
Type de jeton échangé. Pour ces requêtes, ce paramètre a la valeur urn:ietf:params:oauth:grant-type:jwt-bearer. |
assertion |
Jeton Web JSON (JWT) qui fournit une assertion signée de l'identité de l'utilisateur Google. Le JWT contient des informations telles que l'ID de compte Google, le nom et l'adresse e-mail de l'utilisateur. |
client_id |
ID client que vous avez attribué à Google. |
client_secret |
Code secret du client que vous avez attribué à Google. |
Le jeton JWT du paramètre assertion contient l'ID, le nom et l'adresse e-mail du compte Google de l'utilisateur. Vous pouvez les utiliser pour créer un compte sur votre service.
Pour répondre aux requêtes d'intent create, votre point de terminaison d'échange de jetons doit effectuer les étapes suivantes :
- Validez et décodez l'assertion JWT.
- Validez les informations de l'utilisateur et créez un compte.
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é:
emailcomporte le suffixe@gmail.com. Il s'agit d'un compte Gmail.email_verifiedest "true" ethdest 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.
Valider les informations de 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
subde l'assertion, figure dans votre base de données utilisateur. - L'adresse e-mail de l'assertion correspond à un utilisateur de votre base de données.
Si l'une ou l'autre de ces conditions est remplie, invitez l'utilisateur à associer son compte existant à son compte Google. Pour ce faire, répondez à la requête avec une erreur HTTP 401 qui spécifie error=linking_error et indique l'adresse e-mail de l'utilisateur comme login_hint. Voici un exemple de réponse :
HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8
{
"error":"linking_error",
"login_hint":"foo@bar.com"
}
Lorsque Google reçoit une réponse d'erreur 401 avec linking_error, il redirige l'utilisateur vers votre point de terminaison d'autorisation avec login_hint comme paramètre. L'utilisateur associe son compte à l'aide du flux d'association OAuth dans son navigateur.
Si aucune de ces conditions n'est remplie, créez un compte utilisateur avec les informations fournies dans le JWT. Les nouveaux comptes n'ont généralement pas de mot de passe défini. Nous vous recommandons d'ajouter S'identifier avec Google à d'autres plates-formes pour permettre aux utilisateurs de se connecter avec Google sur les surfaces de votre application. Vous pouvez également envoyer à 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 et de se connecter sur d'autres plates-formes.
Une fois la création terminée, émettez un jeton d'accès , puis renvoyez les valeurs dans un objet JSON dans le corps de votre réponse HTTPS, comme dans l'exemple suivant :
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Obtenir votre ID client pour les API Google
Vous devrez fournir votre ID client de l'API Google lors de la procédure d'enregistrement de l'association de compte. Pour obtenir votre ID client API à l'aide du projet que vous avez créé lors de la procédure d'association OAuth. Pour cela, procédez comme suit :
- Accédez à la page Clients.
Créez ou sélectionnez un projet Google APIs.
Si votre projet ne possède pas d'ID client pour le type d'application Web, cliquez sur Créer un client pour en créer un. Veillez à inclure le domaine de votre site dans la zone Origines JavaScript autorisées. Lorsque vous effectuez des tests ou un développement en local, vous devez ajouter
http://localhostethttp://localhost:<port_number>au champ Origines JavaScript autorisées.
Valider votre intégration
You can validate your implementation by using the OAuth 2.0 Playground tool.
In the tool, do the following steps:
- Click Configuration to open the OAuth 2.0 Configuration window.
- In the OAuth flow field, select Client-side.
- In the OAuth Endpoints field, select Custom.
- Specify your OAuth 2.0 endpoint and the client ID you assigned to Google in the corresponding fields.
- In the Step 1 section, don't select any Google scopes. Instead, leave this field blank or type a scope valid for your server (or an arbitrary string if you don't use OAuth scopes). When you're done, click Authorize APIs.
- In the Step 2 and Step 3 sections, go through the OAuth 2.0 flow and verify that each step works as intended.
You can validate your implementation by using the Google Account Linking Demo tool.
In the tool, do the following steps:
- Click the Sign in with Google button.
- Choose the account you'd like to link.
- Enter the service ID.
- Optionally enter one or more scopes that you will request access for.
- Click Start Demo.
- When prompted, confirm that you may consent and deny the linking request.
- Confirm that you are redirected to your platform.