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

  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.
Association de compte sur le téléphone d'un utilisateur avec l'association simplifiée

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.

Utilisateur Application Google / Serveur Votre jeton Point de terminaison d'échange Votre API 1. L'utilisateur lance l'association 2. Demander Se connecter avec Google 3. Se connecter avec Google 4. check intent (assertion JWT) 5. account_found: true/false Si un compte est trouvé : 6. get intent Si aucun compte n'est trouvé : 6. create intent 7. access_token, refresh_token 8. Stocker des jetons utilisateur 9. Accéder aux ressources utilisateur
Figure 2 : Séquence d'événements dans le flux d'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, 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 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 : 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.

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

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

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 sub de 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",
}

Gérer l'association automatique (obtenir l'intention)

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 un jeton pour l'utilisateur. Si le Le compte Google ne correspond à aucun utilisateur existant, le point de terminaison de votre échange de jetons renvoie une erreur linking_error et une valeur login_hint facultative.

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=get&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 get.
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.
scope Facultatif:toutes les habilitations que vous avez configurées pour les demandes utilisateurs.
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 get, 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é:

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

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 sub de 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 un compte est trouvé pour l'utilisateur, émettez un jeton d'accès et 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
}

Dans certains cas, l'association de comptes basée sur un jeton d'ID peut échouer pour l'utilisateur. Si le fait pour une raison quelconque, votre point de terminaison d'échange de jetons doit répondre 401 spécifiant error=linking_error, comme le montre l'exemple suivant:

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 envoie l'utilisateur à votre point de terminaison d'autorisation avec login_hint comme paramètre. La L'utilisateur effectue l'association du compte à l'aide du flux d'association OAuth dans son navigateur.

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

  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.