Association simplifiée avec OAuth et Google Sign-In

Présentation

L'association simplifiée avec Google Sign-In basée sur OAuth ajoute Google Sign-In Association OAuth : Cela offre une expérience d'association transparente pour les utilisateurs Google, et la création de compte, qui permet à l'utilisateur de créer un nouveau compte sur votre service à l'aide de son compte Google.

Pour associer un compte avec OAuth et Google Sign-In, procédez comme suit : étapes:

  1. Commencez par demander à l'utilisateur l'autorisation d'accéder à 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 de correspondance pour l'utilisateur Google dans votre système d'authentification, valider le jeton d'ID reçu de Google. Vous pouvez ensuite créer un profil utilisateur sur les informations de profil contenues dans le jeton d'ID.
Cette figure montre comment un utilisateur doit associer son compte Google à l'aide de la procédure d'association simplifiée. La première capture d'écran montre comment un utilisateur peut sélectionner votre application à associer. La deuxième capture d'écran permet à l'utilisateur de confirmer s'il possède déjà un compte 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 à votre application. La cinquième capture d'écran montre un compte utilisateur correctement associé dans l'appli Google.

Figure 1 : Association de comptes sur le téléphone d'un utilisateur grâce à l'association simplifiée

Conditions requises pour l'association simplifiée

Implémenter votre serveur OAuth

Votre point de terminaison d'échange de jetons doit être compatible avec les intents check, create et get. Vous trouverez ci-dessous les étapes du processus d'association de comptes et le moment où les différents intents sont appelés:

  1. L'utilisateur a-t-il un compte dans votre système d'authentification ? (L'utilisateur décide en sélectionnant OUI ou NON) <ph type="x-smartling-placeholder">
      </ph>
    1. OUI : L'utilisateur se sert-il de l'adresse e-mail associée à son compte Google pour se connecter à votre plate-forme ? (L'utilisateur décide en sélectionnant OUI ou NON) <ph type="x-smartling-placeholder">
        </ph>
      1. OUI : L'utilisateur possède-t-il un compte qui correspond dans votre système d'authentification ? (check intent est appelé pour confirmer) <ph type="x-smartling-placeholder">
          </ph>
        1. OUI : get intent est appelé et le compte est associé si la récupération de l'intent aboutit.
        2. NON : Créer un compte ? (L'utilisateur décide en sélectionnant OUI ou NON) <ph type="x-smartling-placeholder">
            </ph>
          1. OUI : create intent est appelé et le compte est associé si la création de l'intent aboutit.
          2. NON : le flux Web OAuth est déclenché, l'utilisateur est dirigé vers son navigateur et a la possibilité d'associer son compte à une autre adresse e-mail.
      2. NON : Le flux Web OAuth est déclenché, l'utilisateur est dirigé vers son navigateur et a la possibilité d'associer son compte à une autre adresse e-mail.
    2. NON : L'utilisateur possède-t-il un compte qui correspond dans votre système d'authentification ? (check intent est appelé pour confirmer) <ph type="x-smartling-placeholder">
        </ph>
      1. OUI : get intent est appelé et le compte est associé si la récupération de l'intent aboutit.
      2. NON : create intent est appelé et le compte est associé si la création de l'intent aboutit.

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.

Gérer la création de compte via Google Sign-In (créer un intent)

Lorsqu'un utilisateur doit créer un compte sur votre service, Google lui envoie une demande au point de terminaison de votre échange de jetons qui spécifie intent=create.

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

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

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

Le JWT du paramètre assertion contient l'ID du compte Google de l'utilisateur, et l'adresse e-mail, que vous pourrez utiliser pour créer un nouveau compte sur votre Google Cloud.

Pour répondre aux requêtes d'intent create, le point de terminaison de votre échange de jetons doit procéder comme suit:

  • Validez et décodez l'assertion JWT.
  • Validez les informations sur 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é:

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

Valider les informations sur 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 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, invitez l'utilisateur à associer son compte existant avec son compte Google. Pour ce faire, répondez à la requête avec une erreur HTTP 401. qui spécifie error=linking_error et attribue 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 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.

Si aucune condition n'est vraie, créez un nouveau compte d'utilisateur avec les informations fournies dans le JWT. En règle générale, aucun mot de passe n'est défini pour les nouveaux comptes. Il est recommandé d'ajouter Google Sign-In aux autres plates-formes pour permettre aux utilisateurs vous connecter à Google sur toutes les surfaces de votre application. Vous pouvez également Vous pouvez envoyer à l'utilisateur un lien qui lancera le processus de récupération de mot de passe pour lui permettre pour définir un mot de passe afin de se connecter sur d'autres plates-formes.

Une fois la création terminée, émettez un jeton d'accès et le jeton d'actualisation et qui renvoient les valeurs dans un objet JSON 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 pour l'API Google lors du processus d'enregistrement de l'association de comptes.

Pour obtenir votre ID client d'API à l'aide du projet que vous avez créé au cours de la procédure d'association OAuth, procédez comme suit : Pour ce faire, procédez comme suit :

  1. Ouvrez la page Identifiants du Console Google APIs
  2. Créez ou sélectionnez un projet d'API Google.

    Si votre projet ne dispose pas d'un ID client pour le type d'application Web, cliquez sur Créer des identifiants > ID client OAuth pour en créer un. Veillez à inclure domaine de votre site dans la zone Origines JavaScript autorisées. Lorsque vous effectuez développement ou test en local, vous devez ajouter http://localhost et http://localhost:<port_number> dans le champ Origines JavaScript autorisées.

Valider votre implémentation

Vous pouvez valider votre implémentation en utilisant le Playground OAuth 2.0 outil.

Dans l'outil, procédez comme suit :

  1. Cliquez sur Configuration des pour ouvrir la fenêtre Configuration OAuth 2.0.
  2. Dans le champ d'écoulement OAuth, sélectionnez côté client.
  3. Dans le domaine Endpoints OAuth, sélectionnez 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 Étape 1, ne sélectionnez pas de champs Google. Au lieu de cela, laissez ce champ vide ou saisissez une étendue valide pour votre serveur (ou une chaîne arbitraire si vous n'utilisez pas d'étendues OAuth). Lorsque vous avez terminé, cliquez sur Autoriser les API.
  6. Dans les étapes 2 et 3 sections, passez par le flux OAuth 2.0 et vérifiez que chaque étape fonctionne comme prévu.

Vous pouvez valider votre implémentation en utilisant le compte Google Linking Demo outil.

Dans l'outil, procédez comme suit :

  1. Cliquez sur le signe-avec le bouton Google.
  2. Choisissez le compte que vous souhaitez associer.
  3. Saisissez l'ID du service.
  4. Saisissez éventuellement une ou plusieurs étendues pour lesquelles vous demanderez l'accès.
  5. Cliquez sur Démarrer démo.
  6. Lorsque vous y êtes invité, confirmez que vous pouvez consentir et refuser la demande d'association.
  7. Confirmez que vous êtes redirigé vers votre plateforme.