Association simplifiée avec OAuth et Se connecter avec Google

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 d'associer facilement leur compte 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 :

  1. Demandez d'abord à l'utilisateur d'autoriser l'accès à son profil Google.
  2. Utilisez les informations de son profil pour vérifier si le compte utilisateur existe.
  3. Pour les utilisateurs existants, associez les comptes.
  4. 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é.
Cette figure montre les étapes à suivre pour qu'un utilisateur associe son compte Google à l'aide du flux d'association simplifié. La première capture d'écran montre comment un utilisateur peut sélectionner votre application pour l'associer. La deuxième capture d'écran permet à l'utilisateur de confirmer s'il dispose ou non d'un compte existant sur votre service. La troisième capture d'écran permet à l'utilisateur de sélectionner le compte Google qu'il souhaite associer. La quatrième capture d'écran montre la confirmation de l'association du compte Google de l'utilisateur à votre application. La cinquième capture d'écran montre un compte utilisateur associé dans l'appli Google.

Figure 1 : Association de compte sur le téléphone d'un utilisateur avec l'association simplifiée

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, create et get.

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 :

  1. L'utilisateur dispose-t-il d'un compte dans votre système d'authentification ? (L'utilisateur décide en sélectionnant OUI ou NON)
    1. 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)
      1. OUI : l'utilisateur dispose-t-il d'un compte correspondant dans votre système d'authentification ? (check intent est appelé pour confirmer)
        1. OUI : get intent est appelé et le compte est associé si l'intention de récupération est renvoyée avec succès.
        2. NON : Créer un compte ? (L'utilisateur décide en sélectionnant OUI ou NON)
          1. OUI : create intent est appelé et le compte est associé si l'intention de création est renvoyée avec succès.
          2. 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.
      2. 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.
    2. NON : l'utilisateur dispose-t-il d'un compte correspondant dans votre système d'authentification ? (check intent est appelé pour confirmation)
      1. OUI : get intent est appelé et le compte est associé si l'intention de récupération est renvoyée avec succès.
      2. NON : create intent est appelé et le compte est associé si l'intention de création est renvoyée avec succès.

Check for an existing user account (check 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 responds with account_found=true. If the Google account doesn't match an existing user, your token exchange endpoint returns an HTTP 404 Not Found error with account_found=false.

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=check&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 check.
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.
client_id The client ID you assigned to Google.
client_secret The client secret you assigned to Google.

To respond to the check 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é:

  • 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.

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 sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If either condition is true, the user has already signed up. In that case, return a response like the following:

HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8

{
  "account_found":"true",
}

If neither the Google Account ID nor the email address specified in the assertion matches a user in your database, the user hasn't signed up yet. In this case, your token exchange endpoint needs to reply with a HTTP 404 error that specifies "account_found": "false", as in the following example:

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é:

  • 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.

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 sub field, 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.

Handle account creation using Sign in with Google (create intent)

When a user needs to create an account on your service, Google makes a request to your token exchange endpoint that specifies intent=create.

The request has the following form:

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

Your token exchange endpoint must able to handle the following parameters:

Token endpoint parameters
intent For these requests, the value of this parameter is create.
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.
client_id The client ID you assigned to Google.
client_secret The client secret you assigned to Google.

The JWT within the assertion parameter contains the user's Google Account ID, name, and email address, which you can use to create a new account on your service.

To respond to the create intent requests, your token exchange endpoint must perform the following steps:

  • Validate and decode the JWT assertion.
  • Validate user information and create new account.
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.

Validate user information and create new account

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If either condition is true, prompt the user to link their existing account with their Google Account. To do so, respond to the request with an HTTP 401 error that specifies error=linking_error and gives the user's email address as the login_hint. The following is a sample response:

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.

If neither condition is true, create a new user account with the information provided in the JWT. New accounts don't typically have a password set. It's recommended that you add Sign in with Google to other platforms to enable users to sign in with Google across the surfaces of your application. Alternatively, you can email the user a link that starts your password recovery flow to allow the user to set a password to sign in on other platforms.

When the creation is completed, 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
}

Obtenir votre ID client pour les API Google

Vous devrez fournir votre ID client Google API lors de la procédure d'enregistrement pour 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 ce faire, procédez comme suit :

  1. Accédez à la page Clients.
  2. 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://localhost et http://localhost:<port_number> au champ Origines JavaScript autorisées.

Valider votre intégration

Vous pouvez valider votre implémentation à l'aide de l' outil OAuth 2.0 Playground.

Dans l'outil, procédez comme suit :

  1. Cliquez sur Configuration pour ouvrir la fenêtre de configuration OAuth 2.0.
  2. Dans le champ OAuth flow (Flux OAuth), sélectionnez Client-side (Côté client).
  3. Dans le champ OAuth Endpoints (Points de terminaison OAuth), sélectionnez Custom (Personnalisé).
  4. Spécifiez votre point de terminaison OAuth 2.0 et l'ID client que vous avez attribué à Google dans les champs correspondants.
  5. Dans la section Step 1 (Étape 1), ne sélectionnez aucun champ d'application Google. Laissez plutôt ce champ vide ou saisissez un champ d'application valide pour votre serveur (ou une chaîne arbitraire si vous n'utilisez pas de champs d'application OAuth). Lorsque vous avez terminé, cliquez sur Authorize APIs (Autoriser les API).
  6. Dans les sections Step 2 (Étape 2) et Step 3 (Étape 3), parcourez le flux OAuth 2.0 et vérifiez que chaque étape fonctionne comme prévu.

Vous pouvez valider votre implémentation à l'aide de l'outil de démonstration de l'association de comptes Google .

Dans l'outil, procédez comme suit :

  1. Cliquez sur le bouton Se connecter avec Google.
  2. Sélectionnez le compte que vous souhaitez associer.
  3. Saisissez l'ID de service.
  4. Vous pouvez également saisir un ou plusieurs champs d'application pour lesquels vous demanderez l'accès.
  5. Cliquez sur Start Demo (Démarrer la démonstration).
  6. Lorsque vous y êtes invité, confirmez que vous pouvez donner votre consentement et refuser la demande d'association.
  7. Vérifiez que vous êtes redirigé vers votre plate-forme.