La bibliothèque Google Identity Services permet aux utilisateurs de demander un code d'autorisation à Google à l'aide d'un flux d'expérience utilisateur basé sur une fenêtre pop-up ou une redirection dans le navigateur. Cela lance un flux OAuth 2.0 sécurisé et génère un jeton d'accès utilisé pour appeler les API Google au nom d'un utilisateur.
Résumé du flux avec code d'autorisation OAuth 2.0 :
- Dans un navigateur, le propriétaire du compte Google demande un code d'autorisation à Google à l'aide d'un geste tel qu'un clic sur un bouton.
- Google répond en envoyant un code d'autorisation unique à un rappel dans votre application Web JavaScript s'exécutant dans le navigateur de l'utilisateur, ou en appelant directement votre point de terminaison de code d'autorisation à l'aide d'une redirection de navigateur.
- Votre plate-forme de backend héberge un point de terminaison de code d'autorisation et reçoit le code. Une fois validé, ce code est échangé contre des jetons d'accès et d'actualisation par utilisateur à l'aide d'une requête envoyée au point de terminaison de jeton de Google.
- Google valide le code d'autorisation, confirme que la demande provient de votre plate-forme sécurisée, émet des jetons d'accès et d'actualisation, puis renvoie les jetons en appelant le point de terminaison de connexion hébergé par votre plate-forme.
- Votre point de terminaison de connexion reçoit les jetons d'accès et d'actualisation, et stocke le jeton d'actualisation de manière sécurisée pour une utilisation ultérieure.
Prérequis
Suivez les étapes décrites dans Configuration pour configurer votre écran de consentement OAuth, obtenir un ID client et charger la bibliothèque cliente.
Initialiser un client Code
La méthode google.accounts.oauth2.initCodeClient()
initialise un client de code.
Mode pop-up ou redirection
Vous pouvez choisir de partager un code d'authentification à l'aide du flux utilisateur en mode Redirection ou Pop-up. En mode Redirection, vous hébergez un point de terminaison d'autorisation OAuth2 sur votre serveur, et Google redirige le user-agent vers ce point de terminaison, en partageant le code d'authentification en tant que paramètre d'URL. En mode pop-up, vous définissez un gestionnaire de rappel JavaScript qui envoie le code d'autorisation à votre serveur. Le mode pop-up peut être utilisé pour offrir une expérience utilisateur fluide sans que les visiteurs aient à quitter votre site.
Pour initialiser un client pour :
Redirigez le flux UX, définissez
ux_mode
surredirect
et la valeur deredirect_uri
sur le point de terminaison du code d'autorisation de votre plate-forme. La valeur doit correspondre exactement à l'un des URI de redirection autorisés pour le client OAuth 2.0 que vous avez configuré dans la console Google Cloud. Il doit également respecter les règles de validation des URI de redirection.Pour le flux UX de la fenêtre pop-up, définissez
ux_mode
surpopup
et la valeur decallback
sur le nom de la fonction que vous utiliserez pour envoyer les codes d'autorisation à votre plate-forme. La valeur deredirect_uri
est définie par défaut sur l'origine de la page qui appelleinitCodeClient
. Cette valeur est utilisée ultérieurement dans le flux lorsque le code d'authentification est échangé contre un jeton d'accès ou d'actualisation. Par exemple,https://www.example.com/index.html
appelleinitCodeClient
et l'originehttps://www.example.com
correspond à la valeur deredirect_url
.
Se protéger contre les attaques CSRF
Pour éviter les attaques de falsification de requêtes intersites (CSRF), des techniques légèrement différentes sont utilisées pour les flux UX en mode redirection et pop-up. Pour le mode "Redirection", le paramètre state OAuth 2.0 est utilisé. Pour en savoir plus sur la génération et la validation du paramètre state, consultez la section 10.12 Cross-Site Request Forgery de la RFC6749. En mode pop-up, vous ajoutez un en-tête HTTP personnalisé à vos requêtes, puis vous vérifiez sur votre serveur qu'il correspond à la valeur et à l'origine attendues.
Choisissez un mode UX pour afficher un extrait de code montrant la gestion du code d'authentification et du CSRF :
Mode de redirection
Initialisez un client vers lequel Google redirige le navigateur de l'utilisateur vers votre point de terminaison d'authentification, en partageant le code d'authentification en tant que paramètre d'URL.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'redirect',
redirect_uri: 'https://oauth2.example.com/code',
state: 'YOUR_BINDING_VALUE'
});
Mode pop-up
Initialisez un client où l'utilisateur commence le flux d'autorisation dans une boîte de dialogue pop-up. Une fois le consentement obtenu, le code d'autorisation est renvoyé par Google au navigateur de l'utilisateur à l'aide d'une fonction de rappel. Une requête POST du gestionnaire de rappel JS envoie le code d'autorisation à un point de terminaison sur le serveur backend, où il est d'abord validé, puis le reste du flux OAuth est effectué.
const client = google.accounts.oauth2.initCodeClient({
client_id: 'YOUR_CLIENT_ID',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
ux_mode: 'popup',
callback: (response) => {
const xhr = new XMLHttpRequest();
xhr.open('POST', "https://oauth2.example.com/code", true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// Set custom header for CRSF
xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
xhr.onload = function() {
console.log('Auth code response: ' + xhr.responseText);
};
xhr.send('code=' + response.code);
},
});
Déclencher le flux de code OAuth 2.0
Appelez la méthode requestCode()
du client de code pour déclencher le flux utilisateur :
<button onclick="client.requestCode();">Authorize with Google</button>
L'utilisateur devra se connecter à un compte Google et accepter de partager des niveaux d'accès individuels avant de renvoyer un code d'autorisation à votre point de terminaison de redirection ou à votre gestionnaire de rappel.
Gestion du code d'authentification
Google génère un code d'autorisation unique par utilisateur que vous recevez et validez sur votre serveur backend.
En mode pop-up, le gestionnaire spécifié par callback
, qui s'exécute dans le navigateur de l'utilisateur, transmet le code d'autorisation à un point de terminaison hébergé par votre plate-forme.
En mode Redirection, une requête GET
est envoyée au point de terminaison spécifié par redirect_uri
, en partageant le code d'autorisation dans le paramètre code de l'URL. Pour recevoir le code d'autorisation :
Créez un point de terminaison d'autorisation si vous n'avez pas encore d'implémentation.
Mettez à jour votre point de terminaison existant pour qu'il accepte les requêtes
GET
et les paramètres d'URL. Auparavant, une requêtePUT
avec la valeur du code d'autorisation dans la charge utile était utilisée.
Point de terminaison d'autorisation
Votre point de terminaison de code d'autorisation doit gérer les requêtes GET
avec les paramètres de chaîne de requête d'URL suivants :
Nom | Valeur |
---|---|
authuser | Demande d'authentification de connexion de l'utilisateur |
code | Code d'autorisation OAuth2 généré par Google |
HD | Domaine hébergé du compte utilisateur |
prompt | Boîte de dialogue de consentement de l'utilisateur |
champ d'application | Liste d'un ou de plusieurs champs d'application OAuth2 à autoriser, séparés par un espace |
state | Variable d'état CRSF |
Exemple de requête GET
avec des paramètres d'URL vers un point de terminaison nommé auth-code et hébergé par example.com :
Request URL: https://www.example.com/auth-code?state=42a7bd822fe32cc56&code=4/0AX4XfWiAvnXLqxlckFUVao8j0zvZUJ06AMgr-n0vSPotHWcn9p-zHCjqwr47KHS_vDvu8w&scope=email%20profile%20https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/photoslibrary.readonly%20https://www.googleapis.com/auth/contacts.readonly%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&authuser=0&hd=example.com&prompt=consent
Lorsqu'un flux avec code d'autorisation est initié par d'anciennes bibliothèques JavaScript ou par des appels directs aux points de terminaison Google OAuth 2.0, une requête POST
est utilisée.
Exemple de requête POST
contenant le code d'autorisation en tant que charge utile dans le corps de la requête HTTP :
Request URL: https://www.example.com/auth-code
Request Payload: 4/0AX4XfWhll-BMV82wi4YwbrSaTPaRpUGpKqJ4zBxQldU\_70cnIdh-GJOBZlyHU3MNcz4qaw
Valider la demande
Sur votre serveur, procédez comme suit pour éviter les attaques CSRF.
Vérifiez la valeur du paramètre state pour le mode redirection.
Confirmez que l'en-tête X-Requested-With: XmlHttpRequest
est défini sur le mode pop-up.
Vous devez ensuite obtenir des jetons d'actualisation et d'accès auprès de Google uniquement si vous avez d'abord vérifié la demande de code d'authentification.
Obtenir des jetons d'accès et d'actualisation
Une fois que votre plate-forme de backend a reçu un code d'autorisation de Google et vérifié la demande, utilisez le code d'autorisation pour obtenir des jetons d'accès et d'actualisation de Google afin d'effectuer des appels d'API.
Suivez les instructions à partir de l'étape 5 : Échangez le code d'autorisation contre des jetons d'actualisation et d'accès du guide Utiliser OAuth 2.0 pour les applications de serveur Web.
Gérer les jetons
Votre plate-forme stocke les jetons d'actualisation de manière sécurisée. Supprimez les jetons d'actualisation stockés lorsque des comptes utilisateur sont supprimés ou lorsque le consentement de l'utilisateur est révoqué par google.accounts.oauth2.revoke
ou directement depuis https://myaccount.google.com/permissions.
Vous pouvez éventuellement envisager d'utiliser RISC pour protéger les comptes utilisateur avec la protection multi-comptes.
En règle générale, votre plate-forme de backend appelle les API Google à l'aide d'un jeton d'accès. Si votre application Web appelle également directement les API Google depuis le navigateur de l'utilisateur, vous devez implémenter un moyen de partager le jeton d'accès avec votre application Web. Cette opération ne fait pas partie de ce guide. Lorsque vous suivez cette approche et que vous utilisez la bibliothèque cliente des API Google pour JavaScript, utilisez gapi.client.SetToken()
pour stocker temporairement le jeton d'accès dans la mémoire du navigateur et permettre à la bibliothèque d'appeler les API Google.