Utiliser OAuth 2.0 pour les applications de serveur Web

Ce document explique comment les applications de serveur Web utilisent les bibliothèques clientes des API Google ou les points de terminaison OAuth 2.0 de Google pour mettre en œuvre l'autorisation OAuth 2.0 afin d'accéder aux API Google.

OAuth 2.0 permet aux utilisateurs de partager des données spécifiques avec une application tout en préservant la confidentialité de leurs noms d'utilisateur, mots de passe et autres informations. Par exemple, une application peut utiliser OAuth 2.0 pour obtenir l'autorisation des utilisateurs pour stocker des fichiers dans leurs Drive.

Ce flux OAuth 2.0 est spécifiquement destiné à l'autorisation des utilisateurs. Il est conçu pour les applications qui peuvent stocker des informations confidentielles et en préserver l'état. Une application de serveur Web correctement autorisée peut accéder à une API lorsque l'utilisateur interagit avec elle ou après qu'il a quitté l'application.

Les applications de serveur Web utilisent également fréquemment des comptes de service pour autoriser les requêtes API, en particulier lors de l'appel d'API Cloud pour accéder à des données basées sur un projet plutôt qu'à des données spécifiques à un utilisateur. Les applications de serveur Web peuvent utiliser des comptes de service conjointement avec l'autorisation de l'utilisateur.

Bibliothèques clientes

Les exemples propres aux langages de cette page utilisent les bibliothèques clientes des API Google pour mettre en œuvre l'autorisation OAuth 2.0. Pour exécuter les exemples de code, vous devez d'abord installer la bibliothèque cliente pour votre langage.

Lorsque vous utilisez une bibliothèque cliente des API Google pour gérer le flux OAuth 2.0 de votre application, elle effectue de nombreuses actions que l'application devrait gérer elle-même. Par exemple, il détermine quand l'application peut utiliser ou actualiser les jetons d'accès stockés, et quand elle doit obtenir le consentement des utilisateurs. La bibliothèque cliente génère également des URL de redirection correctes et facilite la mise en œuvre de gestionnaires de redirection qui échangent des codes d'autorisation contre des jetons d'accès.

Les bibliothèques clientes des API Google pour les applications côté serveur sont disponibles dans les langages suivants:

Prerequisites

Activer les API pour votre projet.

Toute application qui appelle les API Google doit les activer dans le API Console.

Pour activer une API pour votre projet:

  1. Open the API Library dans Google API Console.
  2. If prompted, select a project, or create a new one.
  3. L'API API Library répertorie toutes les API disponibles, regroupées par famille de produits et par popularité. Si l'API que vous souhaitez activer n'est pas visible dans la liste, recherchez-la ou cliquez sur Tout afficher dans la famille de produits à laquelle elle appartient.
  4. Sélectionnez l'API que vous souhaitez activer, puis cliquez sur le bouton Activer.
  5. If prompted, enable billing.
  6. If prompted, read and accept the API's Terms of Service.

Créer des identifiants d'autorisation

Toute application utilisant OAuth 2.0 pour accéder aux API Google doit disposer d'identifiants d'autorisation qui l'identifient sur le serveur OAuth 2.0 de Google. Les étapes suivantes expliquent comment créer des identifiants pour votre projet. Vos applications peuvent ensuite utiliser les identifiants pour accéder aux API que vous avez activées pour ce projet.

  1. Go to the Credentials page.
  2. Cliquez sur Créer des identifiants > ID client OAuth.
  3. Sélectionnez le type d'application Web application (Application Web).
  4. Remplissez le formulaire, puis cliquez sur Créer. Les applications qui utilisent des langages et des frameworks tels que PHP, Java, Python, Ruby et .NET doivent spécifier des URI de redirection autorisés. Les URI de redirection sont les points de terminaison auxquels le serveur OAuth 2.0 peut envoyer des réponses. Ces points de terminaison doivent respecter les Règles de validation de Google.

    Pour les tests, vous pouvez spécifier des URI qui font référence à la machine locale, tels que http://localhost:8080. En gardant cela à l'esprit, notez que tous les exemples de ce document utilisent http://localhost:8080 comme URI de redirection.

    Nous vous recommandons de concevoir les points de terminaison d'authentification de votre application afin qu'elle n'expose pas les codes d'autorisation à d'autres ressources de la page.

Une fois vos identifiants créés, téléchargez le fichier client_secret.json à partir de API Console. Stockez le fichier de manière sécurisée dans un emplacement auquel seule votre application peut accéder.

Identifier les niveaux d'accès

Les champs d'application permettent à votre application de demander uniquement l'accès aux ressources dont elle a besoin, tout en permettant aux utilisateurs de contrôler le niveau d'accès qu'ils accordent à votre application. Par conséquent, il peut y avoir une relation inverse entre le nombre de champs d'application demandés et la probabilité d'obtenir le consentement de l'utilisateur.

Avant de commencer à mettre en œuvre l'autorisation OAuth 2.0, nous vous recommandons d'identifier les champs d'application pour lesquels votre application aura besoin d'une autorisation d'accès.

Nous recommandons également à votre application de demander l'accès aux champs d'application des autorisations via un processus d'autorisation incrémentielle, dans lequel votre application demande l'accès aux données utilisateur dans le contexte. Cette bonne pratique permet aux utilisateurs de mieux comprendre pourquoi votre application a besoin de l'accès qu'elle demande.

Le document Champs d'application de l'API OAuth 2.0 contient la liste complète des habilitations que vous pouvez utiliser pour accéder aux API Google.

Exigences spécifiques à la langue

Pour exécuter les exemples de code de ce document, vous devez disposer d'un compte Google, d'un accès à Internet et d'un navigateur Web. Si vous utilisez l'une des bibliothèques clientes de l'API, consultez également les exigences spécifiques au langage ci-dessous.

PHP

Pour exécuter les exemples de code PHP dans ce document, vous avez besoin des éléments suivants:

  • PHP 5.6 ou version ultérieure, avec l'interface de ligne de commande (CLI) et l'extension JSON installées.
  • Outil de gestion des dépendances Composer
  • La bibliothèque cliente des API Google pour PHP:

    composer require google/apiclient:^2.10

Python

Pour exécuter les exemples de code Python de ce document, vous avez besoin des éléments suivants:

  • Python 2.6 ou version ultérieure
  • L'outil de gestion de packages pip
  • Bibliothèque cliente des API Google pour Python :
    pip install --upgrade google-api-python-client
  • google-auth, google-auth-oauthlib et google-auth-httplib2 pour l'autorisation de l'utilisateur.
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • Framework d'applications Web Python Flask
    pip install --upgrade flask
  • Bibliothèque HTTP requests.
    pip install --upgrade requests

Ruby

Pour exécuter les exemples de code Ruby de ce document, vous avez besoin des éléments suivants:

  • Ruby 2.2.2 ou version ultérieure
  • La bibliothèque cliente des API Google pour Ruby:

    gem install google-api-client
  • Framework d'applications Web Sinatra Ruby.

    gem install sinatra

Node.js

Pour exécuter les exemples de code Node.js de ce document, vous avez besoin des éléments suivants:

  • LTS de maintenance, LTS actif ou version actuelle de Node.js.
  • Le client Node.js des API Google:

    npm install googleapis

HTTP/REST

Vous n'avez pas besoin d'installer de bibliothèques pour pouvoir appeler directement les points de terminaison OAuth 2.0.

Obtention de jetons d'accès OAuth 2.0

La procédure suivante montre comment votre application interagit avec le serveur OAuth 2.0 de Google afin d'obtenir le consentement d'un utilisateur pour effectuer une requête API au nom de l'utilisateur. Votre application doit disposer de ce consentement pour pouvoir exécuter une requête API Google nécessitant une autorisation utilisateur.

La liste ci-dessous récapitule rapidement ces étapes:

  1. Votre application identifie les autorisations dont elle a besoin.
  2. Votre application redirige l'utilisateur vers Google avec la liste des autorisations demandées.
  3. L'utilisateur décide d'accorder ou non les autorisations à votre application.
  4. Votre application détermine ce que l'utilisateur a décidé.
  5. Si l'utilisateur a accordé les autorisations demandées, votre application récupère les jetons nécessaires pour effectuer des requêtes API au nom de l'utilisateur.

Étape 1: Définissez les paramètres d'autorisation

La première étape consiste à créer la demande d'autorisation. Cette requête définit des paramètres qui identifient votre application et définissent les autorisations que l'utilisateur devra lui accorder.

  • Si vous utilisez une bibliothèque cliente Google pour l'authentification et l'autorisation OAuth 2.0, vous devez créer et configurer un objet qui définit ces paramètres.
  • Si vous appelez directement le point de terminaison Google OAuth 2.0, vous allez générer une URL et définir les paramètres de cette URL.

Les onglets ci-dessous définissent les paramètres d'autorisation compatibles avec les applications de serveur Web. Les exemples propres aux langages montrent également comment utiliser une bibliothèque cliente ou une bibliothèque d'autorisation pour configurer un objet définissant ces paramètres.

PHP

L'extrait de code ci-dessous crée un objet Google\Client(), qui définit les paramètres de la requête d'autorisation.

Cet objet utilise les informations de votre fichier client_secret.json pour identifier votre application. (Consultez la section Créer des identifiants d'autorisation pour en savoir plus sur ce fichier.) L'objet identifie également les champs d'application pour lesquels votre application demande l'autorisation d'accéder à l'application et l'URL du point de terminaison d'authentification de votre application, qui gérera la réponse du serveur OAuth 2.0 de Google. Enfin, le code définit les paramètres facultatifs access_type et include_granted_scopes.

Par exemple, ce code demande un accès hors connexion en lecture seule au Google Drive d'un utilisateur:

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt('consent');
$client->setIncludeGrantedScopes(true);   // incremental auth

La requête spécifie les informations suivantes:

Paramètres
client_id Obligatoire

ID client de votre application. Vous pouvez trouver cette valeur dans API ConsoleCredentials page.

Dans PHP, appelez la fonction setAuthConfig pour charger les identifiants d'autorisation à partir d'un fichier client_secret.json.

$client = new Google\Client();
$client->setAuthConfig('client_secret.json');
redirect_uri Obligatoire

Détermine où le serveur d'API redirige l'utilisateur une fois qu'il a terminé le flux d'autorisation. La valeur doit correspondre exactement à l'un des URI de redirection autorisés pour le client OAuth 2.0, que vous avez configuré dans le fichier API ConsoleCredentials pagede votre client. Si cette valeur ne correspond pas à un URI de redirection autorisé pour le client_id fourni, une erreur redirect_uri_mismatch s'affiche.

Notez que le schéma http ou https, la casse et la barre oblique finale ('/') doivent tous correspondre.

Pour définir cette valeur en PHP, appelez la fonction setRedirectUri. Notez que vous devez spécifier un URI de redirection valide pour le client_id fourni.

$client->setRedirectUri('https://oauth2.example.com/code');
scope Obligatoire

Liste de champs d'application délimités par des espaces identifiant les ressources auxquelles votre application peut accéder au nom de l'utilisateur. Ces valeurs informent l'utilisateur sur l'écran de consentement.

Les champs d'application permettent à votre application de demander uniquement l'accès aux ressources dont elle a besoin, tout en permettant aux utilisateurs de contrôler le niveau d'accès qu'ils accordent à votre application. Par conséquent, il existe une relation inverse entre le nombre de champs d'application demandés et la probabilité d'obtenir le consentement de l'utilisateur.

Pour définir cette valeur en PHP, appelez la fonction addScope:

$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

Dans la mesure du possible, nous recommandons à votre application de demander l'accès aux champs d'application des autorisations en contexte. En demandant l'accès aux données utilisateur en contexte, via l'autorisation incrémentielle, vous aidez les utilisateurs à mieux comprendre pourquoi votre application a besoin de l'accès dont elle a besoin.

access_type Approche conseillée

Indique si votre application peut actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Les valeurs de paramètres valides sont online, qui est la valeur par défaut, et offline.

Définissez la valeur sur offline si votre application doit actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Cette méthode d'actualisation des jetons d'accès est décrite plus loin dans ce document. Cette valeur indique au serveur d'autorisation Google de renvoyer un jeton d'actualisation et un jeton d'accès la première fois que votre application échange un code d'autorisation contre des jetons.

Pour définir cette valeur en PHP, appelez la fonction setAccessType:

$client->setAccessType('offline');
state Approche conseillée

Spécifie toute valeur de chaîne utilisée par votre application pour maintenir l'état entre votre requête d'autorisation et la réponse du serveur d'autorisation. Le serveur renvoie la valeur exacte que vous envoyez en tant que paire name=value dans le composant de requête d'URL (?) de redirect_uri, après que l'utilisateur a accepté ou refusé la demande d'accès de votre application.

Vous pouvez utiliser ce paramètre à différentes fins, par exemple pour diriger l'utilisateur vers la ressource appropriée de votre application, pour envoyer des nonces et pour atténuer la falsification de requêtes intersites. Étant donné que votre redirect_uri peut être deviné, l'utilisation d'une valeur state peut renforcer l'assurance qu'une connexion entrante est le résultat d'une requête d'authentification. Si vous générez une chaîne aléatoire ou encodez le hachage d'un cookie ou d'une autre valeur qui capture l'état du client, vous pouvez valider la réponse pour vous assurer également que la requête et la réponse proviennent du même navigateur, offrant ainsi une protection contre les attaques telles que la falsification de requêtes intersites. Consultez la documentation d'OpenID Connect pour découvrir comment créer et confirmer un jeton state.

Pour définir cette valeur en PHP, appelez la fonction setState:

$client->setState($sample_passthrough_value);
include_granted_scopes Facultatif

Permet aux applications d'utiliser une autorisation incrémentielle pour demander l'accès à des champs d'application supplémentaires en contexte. Si vous définissez la valeur de ce paramètre sur true et que la demande d'autorisation est accordée, le nouveau jeton d'accès couvre également tous les champs d'application auxquels l'utilisateur a précédemment accordé l'accès à l'application. Consultez la section Autorisation incrémentielle pour obtenir des exemples.

Pour définir cette valeur en PHP, appelez la fonction setIncludeGrantedScopes:

$client->setIncludeGrantedScopes(true);
login_hint Facultatif

Si votre application sait quel utilisateur tente de s'authentifier, elle peut utiliser ce paramètre pour fournir un indice au serveur d'authentification Google. L'indice permet au serveur de simplifier le flux de connexion en préremplissant le champ d'adresse e-mail dans le formulaire de connexion ou en sélectionnant la session de connexion multicompte appropriée.

Définissez la valeur du paramètre sur une adresse e-mail ou un identifiant sub, qui équivaut à l'ID Google de l'utilisateur.

Pour définir cette valeur en PHP, appelez la fonction setLoginHint:

$client->setLoginHint('None');
prompt Facultatif

Liste d'invites présentant l'utilisateur, séparées par une espace et sensibles à la casse. Si vous ne spécifiez pas ce paramètre, l'utilisateur n'est invité que la première fois que votre projet demande l'accès. Pour en savoir plus, consultez Demander un nouvel consentement.

Pour définir cette valeur en PHP, appelez la fonction setApprovalPrompt:

$client->setApprovalPrompt('consent');

Les valeurs possibles sont les suivantes :

none N'affichez aucun écran d'authentification ou de consentement. Ne doit pas être spécifié avec d'autres valeurs.
consent Demander le consentement de l'utilisateur.
select_account Inviter l'utilisateur à sélectionner un compte.

Python

L'extrait de code suivant utilise le module google-auth-oauthlib.flow pour créer la requête d'autorisation.

Le code construit un objet Flow, qui identifie votre application à l'aide des informations du fichier client_secret.json que vous avez téléchargé après avoir créé des identifiants d'autorisation. Cet objet identifie également les champs d'application pour lesquels votre application demande l'autorisation d'accéder et l'URL du point de terminaison d'authentification de votre application, qui gérera la réponse du serveur OAuth 2.0 de Google. Enfin, le code définit les paramètres facultatifs access_type et include_granted_scopes.

Par exemple, ce code demande un accès hors connexion en lecture seule au Google Drive d'un utilisateur:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

# Indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
flow.redirect_uri = 'https://www.example.com/oauth2callback'

# Generate URL for request to Google's OAuth 2.0 server.
# Use kwargs to set optional request parameters.
authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')

La requête spécifie les informations suivantes:

Paramètres
client_id Obligatoire

ID client de votre application. Vous pouvez trouver cette valeur dans API ConsoleCredentials page.

En Python, appelez la méthode from_client_secrets_file pour récupérer l'ID client à partir d'un fichier client_secret.json. Vous pouvez également utiliser la méthode from_client_config, qui transmet la configuration client telle qu'elle apparaît dans un fichier de secrets client, mais n'accède pas au fichier.

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])
redirect_uri Obligatoire

Détermine où le serveur d'API redirige l'utilisateur une fois qu'il a terminé le flux d'autorisation. La valeur doit correspondre exactement à l'un des URI de redirection autorisés pour le client OAuth 2.0, que vous avez configuré dans le fichier API ConsoleCredentials pagede votre client. Si cette valeur ne correspond pas à un URI de redirection autorisé pour le client_id fourni, une erreur redirect_uri_mismatch s'affiche.

Notez que le schéma http ou https, la casse et la barre oblique finale ('/') doivent tous correspondre.

Pour définir cette valeur en Python, définissez la propriété redirect_uri de l'objet flow:

flow.redirect_uri = 'https://oauth2.example.com/code'
scope Obligatoire

Liste de champs d'application identifiant les ressources auxquelles votre application peut accéder au nom de l'utilisateur. Ces valeurs informent l'utilisateur sur l'écran de consentement.

Les champs d'application permettent à votre application de demander uniquement l'accès aux ressources dont elle a besoin, tout en permettant aux utilisateurs de contrôler le niveau d'accès qu'ils accordent à votre application. Par conséquent, il existe une relation inverse entre le nombre de champs d'application demandés et la probabilité d'obtenir le consentement de l'utilisateur.

En Python, utilisez la même méthode que celle utilisée pour définir la liste de champs d'application (client_id).

flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'])

Dans la mesure du possible, nous recommandons à votre application de demander l'accès aux champs d'application des autorisations en contexte. En demandant l'accès aux données utilisateur en contexte, via l'autorisation incrémentielle, vous aidez les utilisateurs à mieux comprendre pourquoi votre application a besoin de l'accès dont elle a besoin.

access_type Approche conseillée

Indique si votre application peut actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Les valeurs de paramètres valides sont online, qui est la valeur par défaut, et offline.

Définissez la valeur sur offline si votre application doit actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Cette méthode d'actualisation des jetons d'accès est décrite plus loin dans ce document. Cette valeur indique au serveur d'autorisation Google de renvoyer un jeton d'actualisation et un jeton d'accès la première fois que votre application échange un code d'autorisation contre des jetons.

En Python, définissez le paramètre access_type en spécifiant access_type comme argument à mot clé lorsque vous appelez la méthode flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
state Approche conseillée

Spécifie toute valeur de chaîne utilisée par votre application pour maintenir l'état entre votre requête d'autorisation et la réponse du serveur d'autorisation. Le serveur renvoie la valeur exacte que vous envoyez en tant que paire name=value dans le composant de requête d'URL (?) de redirect_uri, après que l'utilisateur a accepté ou refusé la demande d'accès de votre application.

Vous pouvez utiliser ce paramètre à différentes fins, par exemple pour diriger l'utilisateur vers la ressource appropriée de votre application, pour envoyer des nonces et pour atténuer la falsification de requêtes intersites. Étant donné que votre redirect_uri peut être deviné, l'utilisation d'une valeur state peut renforcer l'assurance qu'une connexion entrante est le résultat d'une requête d'authentification. Si vous générez une chaîne aléatoire ou encodez le hachage d'un cookie ou d'une autre valeur qui capture l'état du client, vous pouvez valider la réponse pour vous assurer également que la requête et la réponse proviennent du même navigateur, offrant ainsi une protection contre les attaques telles que la falsification de requêtes intersites. Consultez la documentation d'OpenID Connect pour découvrir comment créer et confirmer un jeton state.

En Python, définissez le paramètre state en spécifiant state comme argument à mot clé lorsque vous appelez la méthode flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    state=sample_passthrough_value,
    include_granted_scopes='true')
include_granted_scopes Facultatif

Permet aux applications d'utiliser une autorisation incrémentielle pour demander l'accès à des champs d'application supplémentaires en contexte. Si vous définissez la valeur de ce paramètre sur true et que la demande d'autorisation est accordée, le nouveau jeton d'accès couvre également tous les champs d'application auxquels l'utilisateur a précédemment accordé l'accès à l'application. Consultez la section Autorisation incrémentielle pour obtenir des exemples.

En Python, définissez le paramètre include_granted_scopes en spécifiant include_granted_scopes comme argument à mot clé lorsque vous appelez la méthode flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true')
login_hint Facultatif

Si votre application sait quel utilisateur tente de s'authentifier, elle peut utiliser ce paramètre pour fournir un indice au serveur d'authentification Google. L'indice permet au serveur de simplifier le flux de connexion en préremplissant le champ d'adresse e-mail dans le formulaire de connexion ou en sélectionnant la session de connexion multicompte appropriée.

Définissez la valeur du paramètre sur une adresse e-mail ou un identifiant sub, qui équivaut à l'ID Google de l'utilisateur.

En Python, définissez le paramètre login_hint en spécifiant login_hint comme argument à mot clé lorsque vous appelez la méthode flow.authorization_url:

authorization_url, state = flow.authorization_url(
    access_type='offline',
    login_hint='None',
    include_granted_scopes='true')
prompt Facultatif

Liste d'invites présentant l'utilisateur, séparées par une espace et sensibles à la casse. Si vous ne spécifiez pas ce paramètre, l'utilisateur n'est invité que la première fois que votre projet demande l'accès. Pour en savoir plus, consultez Demander un nouvel consentement.

En Python, définissez le paramètre prompt en spécifiant prompt comme argument à mot clé lorsque vous appelez la méthode flow.authorization_url:

authorization_url, state = flow.authorization_url(
      access_type='offline',
      prompt='consent',
      include_granted_scopes='true')

Les valeurs possibles sont les suivantes :

none N'affichez aucun écran d'authentification ou de consentement. Ne doit pas être spécifié avec d'autres valeurs.
consent Demander le consentement de l'utilisateur.
select_account Inviter l'utilisateur à sélectionner un compte.

Ruby

Utilisez le fichier client_secrets.json que vous avez créé pour configurer un objet client dans votre application. Lorsque vous configurez un objet client, vous spécifiez les champs d'application auxquels votre application doit accéder, ainsi que l'URL du point de terminaison d'authentification de votre application, qui gérera la réponse du serveur OAuth 2.0.

Par exemple, ce code demande un accès hors connexion en lecture seule au Google Drive d'un utilisateur:

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'

client_secrets = Google::APIClient::ClientSecrets.load
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'http://www.example.com/oauth2callback',
  :additional_parameters => {
    "access_type" => "offline",         # offline access
    "include_granted_scopes" => "true"  # incremental auth
  }
)

Votre application utilise l'objet client pour effectuer des opérations OAuth 2.0 telles que la génération d'URL de requête d'autorisation et l'application de jetons d'accès aux requêtes HTTP.

Node.js

L'extrait de code ci-dessous crée un objet google.auth.OAuth2, qui définit les paramètres de la requête d'autorisation.

Cet objet utilise les informations de votre fichier client_secret.json pour identifier votre application. Pour demander l'autorisation d'un utilisateur pour récupérer un jeton d'accès, vous le redirigez vers une page de consentement. Pour créer une URL de page de consentement:

const {google} = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
 * from the client_secret.json file. To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

Remarque importante : Le refresh_token n'est renvoyé que lors de la première autorisation. En savoir plus

HTTP/REST

Le point de terminaison OAuth 2.0 de Google est à l'adresse https://accounts.google.com/o/oauth2/v2/auth. Ce point de terminaison n'est accessible que via HTTPS. Les connexions HTTP simples sont refusées.

Le serveur d'autorisation de Google accepte les paramètres de chaîne de requête suivants pour les applications de serveur Web:

Paramètres
client_id Obligatoire

ID client de votre application. Vous pouvez trouver cette valeur dans API ConsoleCredentials page.

redirect_uri Obligatoire

Détermine où le serveur d'API redirige l'utilisateur une fois qu'il a terminé le flux d'autorisation. La valeur doit correspondre exactement à l'un des URI de redirection autorisés pour le client OAuth 2.0, que vous avez configuré dans le fichier API ConsoleCredentials pagede votre client. Si cette valeur ne correspond pas à un URI de redirection autorisé pour le client_id fourni, une erreur redirect_uri_mismatch s'affiche.

Notez que le schéma http ou https, la casse et la barre oblique finale ('/') doivent tous correspondre.

response_type Obligatoire

Détermine si le point de terminaison Google OAuth 2.0 renvoie un code d'autorisation.

Définissez la valeur du paramètre sur code pour les applications de serveur Web.

scope Obligatoire

Liste de champs d'application délimités par des espaces identifiant les ressources auxquelles votre application peut accéder au nom de l'utilisateur. Ces valeurs informent l'utilisateur sur l'écran de consentement.

Les champs d'application permettent à votre application de demander uniquement l'accès aux ressources dont elle a besoin, tout en permettant aux utilisateurs de contrôler le niveau d'accès qu'ils accordent à votre application. Par conséquent, il existe une relation inverse entre le nombre de champs d'application demandés et la probabilité d'obtenir le consentement de l'utilisateur.

Dans la mesure du possible, nous recommandons à votre application de demander l'accès aux champs d'application des autorisations en contexte. En demandant l'accès aux données utilisateur en contexte, via l'autorisation incrémentielle, vous aidez les utilisateurs à mieux comprendre pourquoi votre application a besoin de l'accès dont elle a besoin.

access_type Approche conseillée

Indique si votre application peut actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Les valeurs de paramètres valides sont online, qui est la valeur par défaut, et offline.

Définissez la valeur sur offline si votre application doit actualiser les jetons d'accès lorsque l'utilisateur n'est pas présent dans le navigateur. Cette méthode d'actualisation des jetons d'accès est décrite plus loin dans ce document. Cette valeur indique au serveur d'autorisation Google de renvoyer un jeton d'actualisation et un jeton d'accès la première fois que votre application échange un code d'autorisation contre des jetons.

state Approche conseillée

Spécifie toute valeur de chaîne utilisée par votre application pour maintenir l'état entre votre requête d'autorisation et la réponse du serveur d'autorisation. Le serveur renvoie la valeur exacte que vous envoyez en tant que paire name=value dans le composant de requête d'URL (?) de redirect_uri, après que l'utilisateur a accepté ou refusé la demande d'accès de votre application.

Vous pouvez utiliser ce paramètre à différentes fins, par exemple pour diriger l'utilisateur vers la ressource appropriée de votre application, pour envoyer des nonces et pour atténuer la falsification de requêtes intersites. Étant donné que votre redirect_uri peut être deviné, l'utilisation d'une valeur state peut renforcer l'assurance qu'une connexion entrante est le résultat d'une requête d'authentification. Si vous générez une chaîne aléatoire ou encodez le hachage d'un cookie ou d'une autre valeur qui capture l'état du client, vous pouvez valider la réponse pour vous assurer également que la requête et la réponse proviennent du même navigateur, offrant ainsi une protection contre les attaques telles que la falsification de requêtes intersites. Consultez la documentation d'OpenID Connect pour découvrir comment créer et confirmer un jeton state.

include_granted_scopes Facultatif

Permet aux applications d'utiliser une autorisation incrémentielle pour demander l'accès à des champs d'application supplémentaires en contexte. Si vous définissez la valeur de ce paramètre sur true et que la demande d'autorisation est accordée, le nouveau jeton d'accès couvre également tous les champs d'application auxquels l'utilisateur a précédemment accordé l'accès à l'application. Consultez la section Autorisation incrémentielle pour obtenir des exemples.

login_hint Facultatif

Si votre application sait quel utilisateur tente de s'authentifier, elle peut utiliser ce paramètre pour fournir un indice au serveur d'authentification Google. L'indice permet au serveur de simplifier le flux de connexion en préremplissant le champ d'adresse e-mail dans le formulaire de connexion ou en sélectionnant la session de connexion multicompte appropriée.

Définissez la valeur du paramètre sur une adresse e-mail ou un identifiant sub, qui équivaut à l'ID Google de l'utilisateur.

prompt Facultatif

Liste d'invites présentant l'utilisateur, séparées par une espace et sensibles à la casse. Si vous ne spécifiez pas ce paramètre, l'utilisateur n'est invité que la première fois que votre projet demande l'accès. Pour en savoir plus, consultez Demander un nouvel consentement.

Les valeurs possibles sont les suivantes :

none N'affichez aucun écran d'authentification ou de consentement. Ne doit pas être spécifié avec d'autres valeurs.
consent Demander le consentement de l'utilisateur.
select_account Inviter l'utilisateur à sélectionner un compte.

Étape 2: Redirection vers le serveur OAuth 2.0 de Google

Redirigez l'utilisateur vers le serveur OAuth 2.0 de Google pour lancer le processus d'authentification et d'autorisation. Cela se produit généralement lorsque votre application doit accéder pour la première fois aux données de l'utilisateur. Dans le cas d'une autorisation incrémentielle, cette étape se produit également lorsque votre application doit d'abord accéder à des ressources supplémentaires auxquelles elle n'est pas encore autorisée à accéder.

PHP

  1. Générez une URL pour demander l'accès depuis le serveur OAuth 2.0 de Google :
    $auth_url = $client->createAuthUrl();
  2. Rediriger l'utilisateur vers $auth_url :
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

Cet exemple montre comment rediriger l'utilisateur vers l'URL d'autorisation à l'aide du framework d'application Web Flask:

return flask.redirect(authorization_url)

Ruby

  1. Générez une URL pour demander l'accès depuis le serveur OAuth 2.0 de Google :
    auth_uri = auth_client.authorization_uri.to_s
  2. Redirigez l'utilisateur vers auth_uri.

Node.js

  1. Utilisez l'URL générée authorizationUrl à l'étape 1 generateAuthUrl pour demander l'accès au serveur OAuth 2.0 de Google.
  2. Redirigez l'utilisateur vers authorizationUrl.
    res.writeHead(301, { "Location": authorizationUrl });

HTTP/REST

Sample redirect to Google's authorization server

An example URL is shown below, with line breaks and spaces for readability.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Après avoir créé l'URL de requête, redirigez l'utilisateur vers celui-ci.

Le serveur OAuth 2.0 de Google authentifie l'utilisateur et obtient le consentement de celui-ci pour que votre application puisse accéder aux champs d'application demandés. La réponse est renvoyée à votre application à l'aide de l'URL de redirection que vous avez spécifiée.

Étape 3: Google demande l'autorisation de l'utilisateur

Au cours de cette étape, l'utilisateur décide d'accorder ou non l'accès demandé à votre application. À ce stade, Google affiche une fenêtre de consentement indiquant le nom de votre application et des services d'API Google auxquels elle demande l'autorisation d'accéder avec les identifiants d'autorisation de l'utilisateur, ainsi qu'un récapitulatif des champs d'application à accorder. L'utilisateur peut alors autoriser l'accès à un ou plusieurs champs d'application demandés par votre application ou refuser la demande.

Votre application n'a pas besoin d'intervenir à ce stade, car elle attend la réponse du serveur OAuth 2.0 de Google indiquant si un accès a été accordé. Cette réponse est expliquée à l'étape suivante.

Erreurs

Les requêtes envoyées au point de terminaison OAuth 2.0 de Google peuvent afficher des messages d'erreur destinés aux utilisateurs au lieu des flux d'authentification et d'autorisation attendus. Vous trouverez ci-dessous la liste des codes d'erreur courants et des suggestions de résolution.

admin_policy_enforced

Le compte Google ne peut pas autoriser un ou plusieurs champs d'application demandés en raison des règles de son administrateur Google Workspace. Pour savoir comment un administrateur peut restreindre l'accès à tous les champs d'application ou aux champs d'application sensibles et restreints jusqu'à ce que l'accès soit explicitement accordé à votre ID client OAuth, consultez l'article d'aide pour les administrateurs Google Workspace Contrôler les applications tierces et internes ayant accès aux données Google Workspace.

disallowed_useragent

Le point de terminaison de l'autorisation est affiché dans un user-agent intégré interdit par les Règles OAuth 2.0 de Google.

Android

Les développeurs Android peuvent rencontrer ce message d'erreur lorsqu'ils ouvrent des requêtes d'autorisation dans android.webkit.WebView. À la place, les développeurs doivent utiliser des bibliothèques Android telles que Google Sign-In pour Android ou AppAuth pour Android.

Les développeurs Web peuvent rencontrer cette erreur lorsqu'une application Android ouvre un lien Web général dans un user-agent intégré et qu'un utilisateur accède au point de terminaison d'autorisation OAuth 2.0 de Google à partir de votre site. Les développeurs doivent autoriser les liens généraux à s'ouvrir dans le gestionnaire de liens par défaut du système d'exploitation, ce qui inclut les gestionnaires Android App Links ou l'application de navigateur par défaut. La bibliothèque Android Custom Tabs (Onglets personnalisés Android) est également disponible.

iOS

Les développeurs iOS et macOS peuvent rencontrer cette erreur lors de l'ouverture de requêtes d'autorisation dans WKWebView. Les développeurs doivent utiliser des bibliothèques iOS telles que Google Sign-In pour iOS ou AppAuth pour iOS d'OpenID Foundation.

Les développeurs Web peuvent rencontrer cette erreur lorsqu'une application iOS ou macOS ouvre un lien Web général dans un user-agent intégré et qu'un utilisateur accède au point de terminaison d'autorisation OAuth 2.0 de Google à partir de votre site. Les développeurs doivent autoriser les liens généraux à s'ouvrir dans le gestionnaire de liens par défaut du système d'exploitation, ce qui inclut les gestionnaires Universal Links ou l'application de navigateur par défaut. La bibliothèque SFSafariViewController est également une option compatible.

org_internal

L'ID client OAuth dans la requête fait partie d'un projet limitant l'accès aux comptes Google dans une organisation Google Cloud spécifique. Pour en savoir plus sur cette option de configuration, consultez la section Type d'utilisateur de l'article d'aide concernant la configuration de l'écran de consentement OAuth.

redirect_uri_mismatch

Le redirect_uri transmis dans la requête d'autorisation ne correspond à aucun URI de redirection autorisé pour l'ID client OAuth. Examinez les URI de redirection autorisés dans Google API Console Credentials page.

Étape 4: Gérez la réponse du serveur OAuth 2.0

Le serveur OAuth 2.0 répond à la demande d'accès de votre application en utilisant l'URL spécifiée dans la requête.

Si l'utilisateur approuve la demande d'accès, la réponse contient un code d'autorisation. Si l'utilisateur n'approuve pas la requête, la réponse contient un message d'erreur. Le code d'autorisation ou le message d'erreur renvoyé au serveur Web apparaît dans la chaîne de requête, comme indiqué ci-dessous:

Réponse d'erreur:

https://oauth2.example.com/auth?error=access_denied

Une réponse contenant le code d'autorisation:

https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

Exemple de réponse du serveur OAuth 2.0

Vous pouvez tester ce flux en cliquant sur l'exemple d'URL suivant, qui demande un accès en lecture seule pour afficher les métadonnées des fichiers de votre Google Drive:

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly&
 access_type=offline&
 include_granted_scopes=true&
 response_type=code&
 state=state_parameter_passthrough_value&
 redirect_uri=https%3A//oauth2.example.com/code&
 client_id=client_id

Une fois le parcours OAuth 2.0 terminé, vous devriez être redirigé vers http://localhost/oauth2callback, ce qui générera probablement une erreur 404 NOT FOUND, sauf si votre machine locale diffuse un fichier à cette adresse. L'étape suivante fournit plus de détails sur les informations renvoyées dans l'URI lorsque l'utilisateur est redirigé vers votre application.

Étape 5: Échangez le code d'autorisation pour les jetons d'actualisation et d'accès

Une fois que le serveur Web a reçu le code d'autorisation, il peut l'échanger contre un jeton d'accès.

PHP

Pour échanger un code d'autorisation contre un jeton d'accès, utilisez la méthode authenticate:

$client->authenticate($_GET['code']);

Vous pouvez récupérer le jeton d'accès avec la méthode getAccessToken:

$access_token = $client->getAccessToken();

Python

Sur la page de rappel, utilisez la bibliothèque google-auth pour vérifier la réponse du serveur d'autorisation. Utilisez ensuite la méthode flow.fetch_token pour échanger le code d'autorisation dans cette réponse contre un jeton d'accès:

state = flask.session['state']
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/drive.metadata.readonly'],
    state=state)
flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

authorization_response = flask.request.url
flow.fetch_token(authorization_response=authorization_response)

# Store the credentials in the session.
# ACTION ITEM for developers:
#     Store user's access and refresh tokens in your data store if
#     incorporating this code into your real app.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'token_uri': credentials.token_uri,
    'client_id': credentials.client_id,
    'client_secret': credentials.client_secret,
    'scopes': credentials.scopes}

Ruby

Pour échanger un code d'autorisation contre un jeton d'accès, utilisez la méthode fetch_access_token!:

auth_client.code = auth_code
auth_client.fetch_access_token!

Node.js

Pour échanger un code d'autorisation contre un jeton d'accès, utilisez la méthode getToken:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
if (req.url.startsWith('/oauth2callback')) {
  // Handle the OAuth 2.0 server response
  let q = url.parse(req.url, true).query;

  // Get access and refresh tokens (if access_type is offline)
  let { tokens } = await oauth2Client.getToken(q.code);
  oauth2Client.setCredentials(tokens);
}

HTTP/REST

Pour échanger un code d'autorisation contre un jeton d'accès, appelez le point de terminaison https://oauth2.googleapis.com/token et définissez les paramètres suivants:

Champs
client_id ID client obtenu à partir de API ConsoleCredentials page.
client_secret Code secret du client obtenu à partir de API ConsoleCredentials page.
code Code d'autorisation renvoyé par la requête initiale.
grant_type Comme défini dans la spécification OAuth 2.0, la valeur de ce champ doit être définie sur authorization_code.
redirect_uri L'un des URI de redirection listés pour votre projet dans API ConsoleCredentials page pour le client_id donné.

L'extrait de code suivant présente un exemple de requête:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

Google répond à cette requête en renvoyant un objet JSON contenant un jeton d'accès de courte durée et un jeton d'actualisation. Notez que le jeton d'actualisation n'est renvoyé que si votre application a défini le paramètre access_type sur offline dans la requête initiale du serveur d'autorisation de Google.

La réponse contient les champs suivants :

Champs
access_token Jeton que votre application envoie pour autoriser une requête API Google.
expires_in Durée de vie restante du jeton d'accès, en secondes.
refresh_token Jeton que vous pouvez utiliser pour obtenir un nouveau jeton d'accès. Les jetons d'actualisation sont valides jusqu'à ce que l'utilisateur révoque l'accès. Là encore, ce champ n'est présent dans cette réponse que si vous définissez le paramètre access_type sur offline dans la requête initiale sur le serveur d'autorisation de Google.
scope Les champs d'application d'accès accordés par access_token, sous la forme d'une liste de chaînes sensibles à la casse, séparées par un espace.
token_type Type de jeton renvoyé. Pour le moment, la valeur de ce champ est toujours définie sur Bearer.

L'extrait de code suivant présente un exemple de réponse:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

Appeler les API Google

PHP

Pour appeler les API Google à l'aide du jeton d'accès, procédez comme suit:

  1. Si vous devez appliquer un jeton d'accès à un nouvel objet Google\Client (par exemple, si vous avez stocké le jeton d'accès dans une session utilisateur), utilisez la méthode setAccessToken :
    $client->setAccessToken($access_token);
  2. Créez un objet de service pour l'API que vous souhaitez appeler. Pour créer un objet de service, vous devez fournir un objet Google\Client autorisé au constructeur de l'API que vous souhaitez appeler. Par exemple, pour appeler l'API Drive :
    $drive = new Google\Service\Drive($client);
  3. Envoyez des requêtes au service d'API à l'aide de l'interface fournie par l'objet de service. Par exemple, pour lister les fichiers dans le Google Drive de l'utilisateur authentifié :
    $files = $drive->files->listFiles(array())->getItems();

Python

Une fois que vous avez obtenu un jeton d'accès, votre application peut l'utiliser pour autoriser des requêtes API pour le compte d'un compte utilisateur ou d'un compte de service donné. Utilisez les identifiants d'autorisation spécifiques à l'utilisateur afin de créer un objet de service pour l'API que vous souhaitez appeler, puis utilisez cet objet pour effectuer des requêtes API autorisées.

  1. Créez un objet de service pour l'API que vous souhaitez appeler. Pour créer un objet de service, appelez la méthode build de la bibliothèque googleapiclient.discovery avec le nom et la version de l'API, ainsi que les identifiants utilisateur : Par exemple, pour appeler la version 2 de l'API Drive :
    from googleapiclient.discovery import build
    
    drive = build('drive', 'v2', credentials=credentials)
  2. Envoyez des requêtes au service d'API à l'aide de l'interface fournie par l'objet de service. Par exemple, pour lister les fichiers dans le Google Drive de l'utilisateur authentifié :
    files = drive.files().list().execute()

Ruby

Utilisez l'objet auth_client pour appeler les API Google en procédant comme suit:

  1. Créez un objet de service pour l'API que vous souhaitez appeler. Par exemple, pour appeler la version 2 de l'API Drive :
    drive = Google::Apis::DriveV2::DriveService.new
  2. Définissez les identifiants sur le service :
    drive.authorization = auth_client
  3. Envoyez des requêtes au service d'API à l'aide de l'interface fournie par l'objet de service. Par exemple, pour lister les fichiers dans le Google Drive de l'utilisateur authentifié :
    files = drive.list_files

Vous pouvez également fournir une autorisation pour chaque méthode en fournissant le paramètre options à une méthode:

files = drive.list_files(options: { authorization: auth_client })

Node.js

Après avoir obtenu un jeton d'accès et l'avoir défini sur l'objet OAuth2, utilisez-le pour appeler les API Google. Votre application peut utiliser ce jeton pour autoriser les requêtes API pour le compte d'un utilisateur ou d'un compte de service donné. Créez un objet de service pour l'API que vous souhaitez appeler.

const { google } = require('googleapis');

// Example of using Google Drive API to list filenames in user's Drive.
const drive = google.drive('v3');
drive.files.list({
  auth: oauth2Client,
  pageSize: 10,
  fields: 'nextPageToken, files(id, name)',
}, (err1, res1) => {
  if (err1) return console.log('The API returned an error: ' + err1);
  const files = res1.data.files;
  if (files.length) {
    console.log('Files:');
    files.map((file) => {
      console.log(`${file.name} (${file.id})`);
    });
  } else {
    console.log('No files found.');
  }
});

HTTP/REST

Une fois que votre application a obtenu un jeton d'accès, vous pouvez l'utiliser pour appeler une API Google au nom d'un compte utilisateur donné, si le ou les niveaux d'accès requis par l'API ont été accordés. Pour ce faire, incluez le jeton d'accès dans une requête adressée à l'API en incluant un paramètre de requête access_token ou une valeur Bearer d'en-tête HTTP Authorization. Dans la mesure du possible, il est préférable d'utiliser l'en-tête HTTP, car les chaînes de requête ont tendance à être visibles dans les journaux du serveur. Dans la plupart des cas, vous pouvez utiliser une bibliothèque cliente pour configurer vos appels vers les API Google (par exemple, lorsque vous appelez l'API Drive Files).

Vous pouvez essayer toutes les API Google et afficher leur portée sur OAuth 2.0 Playground.

Exemples HTTP GET

Un appel vers le point de terminaison drive.files (l'API Drive Files) à l'aide de l'en-tête HTTP Authorization: Bearer peut ressembler à ceci. Notez que vous devez spécifier votre propre jeton d'accès:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Voici un appel vers la même API pour l'utilisateur authentifié utilisant le paramètre de chaîne de requête access_token:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

Exemples curl

Vous pouvez tester ces commandes avec l'application de ligne de commande curl. Voici un exemple qui utilise l'option d'en-tête HTTP (recommandé):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

Vous pouvez également utiliser l'option de paramètre de chaîne de requête:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

Exemple complet

L'exemple suivant affiche une liste de fichiers au format JSON dans le Google Drive d'un utilisateur après authentification de l'utilisateur et autorise l'application à accéder aux métadonnées Drive de l'utilisateur.

PHP

Pour exécuter cet exemple:

  1. Dans API Console, ajoutez l'URL de la machine locale à la liste des URL de redirection. Par exemple, ajoutez http://localhost:8080.
  2. Créez un répertoire et accédez-y. Exemple :
    mkdir ~/php-oauth2-example
    cd ~/php-oauth2-example
  3. Installez la bibliothèque cliente des API Google pour PHP à l'aide de Composer :
    composer require google/apiclient:^2.10
  4. Créez les fichiers index.php et oauth2callback.php avec le contenu ci-dessous.
  5. Exécutez l'exemple avec un serveur Web configuré pour diffuser PHP. Si vous utilisez PHP 5.6 ou une version ultérieure, vous pouvez utiliser le serveur Web de test intégré de PHP :
    php -S localhost:8080 ~/php-oauth2-example

index.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfig('client_secrets.json');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  $client->setAccessToken($_SESSION['access_token']);
  $drive = new Google\Service\Drive($client);
  $files = $drive->files->listFiles(array())->getItems();
  echo json_encode($files);
} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

oauth2callback.php

<?php
require_once __DIR__.'/vendor/autoload.php';

session_start();

$client = new Google\Client();
$client->setAuthConfigFile('client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google\Service\Drive::DRIVE_METADATA_READONLY);

if (! isset($_GET['code'])) {
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  $client->authenticate($_GET['code']);
  $_SESSION['access_token'] = $client->getAccessToken();
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

Python

Cet exemple utilise le framework Flask. Il exécute une application Web à l'adresse http://localhost:8080 qui vous permet de tester le flux OAuth 2.0. Si vous accédez à cette URL, vous devriez voir quatre liens:

  • Tester une requête API:ce lien renvoie vers une page qui tente d'exécuter un exemple de requête API. Si nécessaire, il lance le flux d'autorisation. Si l'opération réussit, la page affiche la réponse de l'API.
  • Tester le flux d'authentification directement:ce lien renvoie vers une page qui tente d'envoyer l'utilisateur via le flux d'autorisation. L'application demande l'autorisation d'envoyer des requêtes API autorisées au nom de l'utilisateur.
  • Révoquer les identifiants actuels : ce lien redirige vers une page qui révoque les autorisations que l'utilisateur a déjà accordées à l'application.
  • Effacer les identifiants de session Flask:ce lien efface les identifiants d'autorisation stockés dans la session Flask. Cela vous permet de voir ce qui se passerait si un utilisateur ayant déjà autorisé votre application a tenté d'exécuter une requête API dans une nouvelle session. Il vous permet également de voir la réponse de l'API que votre application obtiendrait si un utilisateur avait révoqué des autorisations accordées à votre application, et que votre application essayait toujours d'autoriser une requête avec un jeton d'accès révoqué.
# -*- coding: utf-8 -*-

import os
import flask
import requests

import google.oauth2.credentials
import google_auth_oauthlib.flow
import googleapiclient.discovery

# This variable specifies the name of a file that contains the OAuth 2.0
# information for this application, including its client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
API_SERVICE_NAME = 'drive'
API_VERSION = 'v2'

app = flask.Flask(__name__)
# Note: A secret key is included in the sample so that it works.
# If you use this code in your application, replace this with a truly secret
# key. See https://flask.palletsprojects.com/quickstart/#sessions.
app.secret_key = 'REPLACE ME - this value is here as a placeholder.'


@app.route('/')
def index():
  return print_index_table()


@app.route('/test')
def test_api_request():
  if 'credentials' not in flask.session:
    return flask.redirect('authorize')

  # Load credentials from the session.
  credentials = google.oauth2.credentials.Credentials(
      **flask.session['credentials'])

  drive = googleapiclient.discovery.build(
      API_SERVICE_NAME, API_VERSION, credentials=credentials)

  files = drive.files().list().execute()

  # Save credentials back to session in case access token was refreshed.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.jsonify(**files)


@app.route('/authorize')
def authorize():
  # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps.
  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES)

  # The URI created here must exactly match one of the authorized redirect URIs
  # for the OAuth 2.0 client, which you configured in the API Console. If this
  # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch'
  # error.
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  authorization_url, state = flow.authorization_url(
      # Enable offline access so that you can refresh an access token without
      # re-prompting the user for permission. Recommended for web server apps.
      access_type='offline',
      # Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes='true')

  # Store the state so the callback can verify the auth server response.
  flask.session['state'] = state

  return flask.redirect(authorization_url)


@app.route('/oauth2callback')
def oauth2callback():
  # Specify the state when creating the flow in the callback so that it can
  # verified in the authorization server response.
  state = flask.session['state']

  flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
      CLIENT_SECRETS_FILE, scopes=SCOPES, state=state)
  flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

  # Use the authorization server's response to fetch the OAuth 2.0 tokens.
  authorization_response = flask.request.url
  flow.fetch_token(authorization_response=authorization_response)

  # Store credentials in the session.
  # ACTION ITEM: In a production app, you likely want to save these
  #              credentials in a persistent database instead.
  credentials = flow.credentials
  flask.session['credentials'] = credentials_to_dict(credentials)

  return flask.redirect(flask.url_for('test_api_request'))


@app.route('/revoke')
def revoke():
  if 'credentials' not in flask.session:
    return ('You need to <a href="/authorize">authorize</a> before ' +
            'testing the code to revoke credentials.')

  credentials = google.oauth2.credentials.Credentials(
    **flask.session['credentials'])

  revoke = requests.post('https://oauth2.googleapis.com/revoke',
      params={'token': credentials.token},
      headers = {'content-type': 'application/x-www-form-urlencoded'})

  status_code = getattr(revoke, 'status_code')
  if status_code == 200:
    return('Credentials successfully revoked.' + print_index_table())
  else:
    return('An error occurred.' + print_index_table())


@app.route('/clear')
def clear_credentials():
  if 'credentials' in flask.session:
    del flask.session['credentials']
  return ('Credentials have been cleared.<br><br>' +
          print_index_table())


def credentials_to_dict(credentials):
  return {'token': credentials.token,
          'refresh_token': credentials.refresh_token,
          'token_uri': credentials.token_uri,
          'client_id': credentials.client_id,
          'client_secret': credentials.client_secret,
          'scopes': credentials.scopes}

def print_index_table():
  return ('<table>' +
          '<tr><td><a href="/test">Test an API request</a></td>' +
          '<td>Submit an API request and see a formatted JSON response. ' +
          '    Go through the authorization flow if there are no stored ' +
          '    credentials for the user.</td></tr>' +
          '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' +
          '<td>Go directly to the authorization flow. If there are stored ' +
          '    credentials, you still might not be prompted to reauthorize ' +
          '    the application.</td></tr>' +
          '<tr><td><a href="/revoke">Revoke current credentials</a></td>' +
          '<td>Revoke the access token associated with the current user ' +
          '    session. After revoking credentials, if you go to the test ' +
          '    page, you should see an <code>invalid_grant</code> error.' +
          '</td></tr>' +
          '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' +
          '<td>Clear the access token currently stored in the user session. ' +
          '    After clearing the token, if you <a href="/test">test the ' +
          '    API request</a> again, you should go back to the auth flow.' +
          '</td></tr></table>')


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification.
  # ACTION ITEM for developers:
  #     When running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

  # Specify a hostname and port that are set as a valid redirect URI
  # for your API project in the Google API Console.
  app.run('localhost', 8080, debug=True)

Ruby

Cet exemple utilise le framework Sinatra.

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'
require 'json'
require 'sinatra'

enable :sessions
set :session_secret, 'setme'

get '/' do
  unless session.has_key?(:credentials)
    redirect to('/oauth2callback')
  end
  client_opts = JSON.parse(session[:credentials])
  auth_client = Signet::OAuth2::Client.new(client_opts)
  drive = Google::Apis::DriveV2::DriveService.new
  files = drive.list_files(options: { authorization: auth_client })
  "<pre>#{JSON.pretty_generate(files.to_h)}</pre>"
end

get '/oauth2callback' do
  client_secrets = Google::APIClient::ClientSecrets.load
  auth_client = client_secrets.to_authorization
  auth_client.update!(
    :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
    :redirect_uri => url('/oauth2callback'))
  if request['code'] == nil
    auth_uri = auth_client.authorization_uri.to_s
    redirect to(auth_uri)
  else
    auth_client.code = request['code']
    auth_client.fetch_access_token!
    auth_client.client_secret = nil
    session[:credentials] = auth_client.to_json
    redirect to('/')
  end
end

Node.js

Pour exécuter cet exemple:

  1. Dans le champ API Console, ajoutez l'URL de la machine locale à la liste des URL de redirection. Par exemple, ajoutez http://localhost.
  2. Assurez-vous que la version LTS de maintenance, la version LTS active ou la version actuelle de Node.js sont installées.
  3. Créez un répertoire et accédez-y. Exemple :
    mkdir ~/nodejs-oauth2-example
    cd ~/nodejs-oauth2-example
  4. Install the Google API Client Library for Node.js using npm:
    npm install googleapis
  5. Créez les fichiers main.js avec le contenu ci-dessous.
  6. Exécutez l'exemple :
    node .\main.js

main.js

const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');

/**
 * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI.
 * To get these credentials for your application, visit
 * https://console.cloud.google.com/apis/credentials.
 */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Drive activity.
const scopes = [
  'https://www.googleapis.com/auth/drive.metadata.readonly'
];

// Generate a url that asks permissions for the Drive activity scope
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as a best practice.
  include_granted_scopes: true
});

/* Global variable that stores user credential in this code example.
 * ACTION ITEM for developers:
 *   Store user's refresh token in your data store if
 *   incorporating this code into your real app.
 *   For more information on handling refresh tokens,
 *   see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens
 */
let userCredential = null;

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to Google's OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }

    // Receive the callback from Google's OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) { // An error response e.g. error=access_denied
        console.log('Error:' + q.error);
      } else { // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        /** Save credential to the global variable in case access token was refreshed.
          * ACTION ITEM: In a production app, you likely want to save the refresh token
          *              in a secure persistent database instead. */
        userCredential = tokens;

        // Example of using Google Drive API to list filenames in user's Drive.
        const drive = google.drive('v3');
        drive.files.list({
          auth: oauth2Client,
          pageSize: 10,
          fields: 'nextPageToken, files(id, name)',
        }, (err1, res1) => {
          if (err1) return console.log('The API returned an error: ' + err1);
          const files = res1.data.files;
          if (files.length) {
            console.log('Files:');
            files.map((file) => {
              console.log(`${file.name} (${file.id})`);
            });
          } else {
            console.log('No files found.');
          }
        });
      }
    }

    // Example on revoking a token
    if (req.url == '/revoke') {
      // Build the string for the POST request
      let postData = "token=" + userCredential.access_token;

      // Options for POST request to Google's OAuth 2.0 server to revoke a token
      let postOptions = {
        host: 'oauth2.googleapis.com',
        port: '443',
        path: '/revoke',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(postData)
        }
      };

      // Set up the request
      const postReq = https.request(postOptions, function (res) {
        res.setEncoding('utf8');
        res.on('data', d => {
          console.log('Response: ' + d);
        });
      });

      postReq.on('error', error => {
        console.log(error)
      });

      // Post the request with data
      postReq.write(postData);
      postReq.end();
    }
    res.end();
  }).listen(80);
}
main().catch(console.error);

HTTP/REST

Cet exemple Python utilise le framework Flask et la bibliothèque Requests (Requêtes) pour illustrer le flux Web OAuth 2.0. Pour ce faire, nous vous recommandons d'utiliser la bibliothèque cliente des API Google pour Python. (L'exemple de l'onglet Python utilise la bibliothèque cliente.)

import json

import flask
import requests


app = flask.Flask(__name__)

CLIENT_ID = '123456789.apps.googleusercontent.com'
CLIENT_SECRET = 'abc123'  # Read from a file or environmental variable in a real app
SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly'
REDIRECT_URI = 'http://example.com/oauth2callback'


@app.route('/')
def index():
  if 'credentials' not in flask.session:
    return flask.redirect(flask.url_for('oauth2callback'))
  credentials = json.loads(flask.session['credentials'])
  if credentials['expires_in'] <= 0:
    return flask.redirect(flask.url_for('oauth2callback'))
  else:
    headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])}
    req_uri = 'https://www.googleapis.com/drive/v2/files'
    r = requests.get(req_uri, headers=headers)
    return r.text


@app.route('/oauth2callback')
def oauth2callback():
  if 'code' not in flask.request.args:
    auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
                '&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE)
    return flask.redirect(auth_uri)
  else:
    auth_code = flask.request.args.get('code')
    data = {'code': auth_code,
            'client_id': CLIENT_ID,
            'client_secret': CLIENT_SECRET,
            'redirect_uri': REDIRECT_URI,
            'grant_type': 'authorization_code'}
    r = requests.post('https://oauth2.googleapis.com/token', data=data)
    flask.session['credentials'] = r.text
    return flask.redirect(flask.url_for('index'))


if __name__ == '__main__':
  import uuid
  app.secret_key = str(uuid.uuid4())
  app.debug = False
  app.run()

Règles de validation de l'URI de redirection

Google applique les règles de validation suivantes pour rediriger les URI afin d'aider les développeurs à sécuriser leurs applications. Vos URI de redirection doivent respecter ces règles. Reportez-vous à la section 3 de la norme RFC 3986 pour obtenir la définition du domaine, de l'hôte, du chemin d'accès, de la requête, du schéma et des informations utilisateur, mentionnée ci-dessous.

Règles de validation
Schéma

Les URI de redirection doivent utiliser le schéma HTTPS, et non le protocole HTTP ordinaire. Les URI hôtes locaux (y compris les URI d'adresses IP localhost) ne sont pas concernés par cette règle.

Organisateur

Les hôtes ne peuvent pas être des adresses IP brutes. Les adresses IP de l'hôte local ne sont pas concernées par cette règle.

Domaine
  • Les TLD de l'hôte (domaines de premier niveau) doivent appartenir à la liste des suffixes publics.
  • Les domaines hôtes ne peuvent pas être “googleusercontent.com”.
  • Les URI de redirection ne peuvent pas contenir de domaines de raccourcissement d'URL (par exemple, goo.gl), sauf si l'application est propriétaire du domaine. De plus, si une application qui possède un domaine de raccourcissement choisit de rediriger vers ce domaine, cet URI de redirection doit inclure “/google-callback/” dans son chemin ou se terminer par “/google-callback”.
  • Informations utilisateur

    Les URI de redirection ne peuvent pas contenir le sous-composant userinfo.

    Chemin d'accès

    Les URI de redirection ne peuvent pas contenir de balayage de chemin (également appelé "suivi de répertoire"), qui est représenté par un “/..” ou un “\..”, ou leur encodage d'URL.

    Requête

    Les URI de redirection ne peuvent pas contenir de redirections ouvertes.

    Fragment

    Les URI de redirection ne peuvent pas contenir le composant de fragment.

    Caractères Les URI de redirection ne peuvent pas contenir certains caractères, y compris les suivants :
    • Caractères génériques ('*')
    • Caractères ASCII non imprimables
    • Encodages de pourcentage incorrects (tout pourcentage d'encodage ne respectant pas la forme d'URL d'un signe de pourcentage suivi de deux chiffres hexadécimaux)
    • Caractères nuls (caractère NULL encodé, comme %00, %C0%80)

    Autorisation incrémentielle

    Dans le protocole OAuth 2.0, votre application demande une autorisation pour accéder aux ressources, qui sont identifiées par les champs d'application. Nous vous recommandons de demander l'autorisation d'accéder aux ressources au moment où vous en avez besoin. Pour activer cette pratique, le serveur d'autorisation de Google prend en charge l'autorisation incrémentielle. Cette fonctionnalité vous permet de demander des champs d'application en fonction des besoins et, si l'utilisateur accorde une autorisation pour le nouveau champ d'application, renvoie un code d'autorisation pouvant être échangé contre un jeton contenant tous les champs d'application accordés par le projet.

    Par exemple, une application qui permet aux utilisateurs de sampler des titres et de créer des mix peut nécessiter très peu de ressources au moment de la connexion, peut-être rien de plus que le nom de la personne qui se connecte. Toutefois, l'enregistrement d'un mix terminé nécessite un accès à Google Drive. La plupart des gens trouveraient cela naturel s'ils n'étaient invités à accéder à leur Google Drive qu'au moment où l'application en avait réellement besoin.

    Dans ce cas, au moment de la connexion, l'application peut demander les champs d'application openid et profile pour effectuer une connexion de base, puis demander le champ d'application https://www.googleapis.com/auth/drive.file au moment de la première requête pour enregistrer un mix.

    Pour mettre en œuvre une autorisation incrémentielle, vous devez suivre le flux normal de demande de jeton d'accès, mais vous assurer que la demande d'autorisation inclut des champs d'application précédemment accordés. Cette approche permet à votre application d'éviter de devoir gérer plusieurs jetons d'accès.

    Les règles suivantes s'appliquent à un jeton d'accès obtenu à partir d'une autorisation incrémentielle:

    • Ce jeton permet d'accéder aux ressources correspondant à l'un des champs d'application inclus dans la nouvelle autorisation combinée.
    • Lorsque vous utilisez le jeton d'actualisation pour obtenir un jeton d'accès combiné, celui-ci représente l'autorisation combinée et peut être utilisé pour n'importe quelle valeur scope incluse dans la réponse.
    • L'autorisation combinée inclut tous les champs d'application accordés par l'utilisateur au projet d'API, même si les autorisations ont été demandées auprès de différents clients. Par exemple, si un utilisateur a accordé l'accès à un champ d'application à l'aide d'un client de bureau d'une application, puis a accordé un autre champ d'application à la même application via un client mobile, l'autorisation combinée inclut les deux champs d'application.
    • Si vous révoquez un jeton représentant une autorisation combinée, l'accès à tous les champs d'application de cette autorisation au nom de l'utilisateur associé est révoqué simultanément.

    Les exemples de code spécifiques à la langue de l'Étape 1: Définir les paramètres d'autorisation et l'exemple d'URL de redirection HTTP/REST à l'Étape 2 : Rediriger vers le serveur OAuth 2.0 de Google utilisent tous une autorisation incrémentielle. Les exemples de code ci-dessous montrent également le code que vous devez ajouter pour utiliser l'autorisation incrémentielle.

    PHP

    $client->setIncludeGrantedScopes(true);

    Python

    En Python, définissez l'argument de mot clé include_granted_scopes sur true pour vous assurer qu'une requête d'autorisation inclut des champs d'application précédemment accordés. Il est possible que include_granted_scopes ne soit pas le seul argument de mot clé que vous définissez, comme illustré dans l'exemple ci-dessous.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Ruby

    auth_client.update!(
      :additional_parameters => {"include_granted_scopes" => "true"}
    )

    Node.js

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    HTTP/REST

    GET https://accounts.google.com/o/oauth2/v2/auth?
      client_id=your_client_id&
      response_type=code&
      state=state_parameter_passthrough_value&
      scope=https%3A//www.googleapis.com/auth/drive.file&
      redirect_uri=https%3A//oauth2.example.com/code&
      prompt=consent&
      include_granted_scopes=true

    Actualiser un jeton d'accès (accès hors connexion)

    Les jetons d'accès expirent régulièrement et deviennent des identifiants non valides pour une requête API associée. Vous pouvez actualiser un jeton d'accès sans demander d'autorisation à l'utilisateur (y compris lorsqu'il n'est pas présent) si vous avez demandé un accès hors connexion aux champs d'application associés au jeton.

    • Si vous utilisez une bibliothèque cliente des API Google, l'objet client actualise le jeton d'accès si nécessaire, à condition de le configurer pour un accès hors connexion.
    • Si vous n'utilisez pas de bibliothèque cliente, vous devez définir le paramètre de requête HTTP access_type sur offline lorsque vous redirigez l'utilisateur vers le serveur OAuth 2.0 de Google. Dans ce cas, le serveur d'autorisation de Google renvoie un jeton d'actualisation lorsque vous échangez un code d'autorisation contre un jeton d'accès. Ensuite, si le jeton d'accès expire (ou à tout autre moment), vous pouvez utiliser un jeton d'actualisation pour obtenir un nouveau jeton d'accès.

    Toute application ayant besoin d'accéder à une API Google lorsque l'utilisateur n'est pas présent doit effectuer une demande d'accès hors connexion. Par exemple, une application qui effectue des services de sauvegarde ou exécute des actions à des moments prédéterminés doit pouvoir actualiser son jeton d'accès en l'absence de l'utilisateur. Le style d'accès par défaut est appelé online.

    Les applications Web côté serveur, les applications installées et les appareils obtiennent tous des jetons d'actualisation pendant le processus d'autorisation. Les jetons d'actualisation ne sont généralement pas utilisés dans les applications Web côté client (JavaScript).

    PHP

    Si votre application a besoin d'un accès hors connexion à une API Google, définissez le type d'accès du client API sur offline :

    $client->setAccessType("offline");

    Une fois qu'un utilisateur a accordé un accès hors connexion aux champs d'application demandés, vous pouvez continuer à utiliser le client API pour accéder aux API Google au nom de l'utilisateur lorsque celui-ci est hors connexion. L'objet client actualisera le jeton d'accès si nécessaire.

    Python

    En Python, définissez l'argument de mot clé access_type sur offline pour vous assurer que vous pourrez actualiser le jeton d'accès sans avoir à renvoyer une demande d'autorisation à l'utilisateur. Il est possible que access_type ne soit pas le seul argument de mot clé que vous définissez, comme illustré dans l'exemple ci-dessous.

    authorization_url, state = flow.authorization_url(
        # Enable offline access so that you can refresh an access token without
        # re-prompting the user for permission. Recommended for web server apps.
        access_type='offline',
        # Enable incremental authorization. Recommended as a best practice.
        include_granted_scopes='true')

    Une fois qu'un utilisateur a accordé un accès hors connexion aux champs d'application demandés, vous pouvez continuer à utiliser le client API pour accéder aux API Google au nom de l'utilisateur lorsque celui-ci est hors connexion. L'objet client actualisera le jeton d'accès si nécessaire.

    Ruby

    Si votre application a besoin d'un accès hors connexion à une API Google, définissez le type d'accès du client API sur offline:

    auth_client.update!(
      :additional_parameters => {"access_type" => "offline"}
    )

    Une fois qu'un utilisateur a accordé un accès hors connexion aux champs d'application demandés, vous pouvez continuer à utiliser le client API pour accéder aux API Google au nom de l'utilisateur lorsque celui-ci est hors connexion. L'objet client actualisera le jeton d'accès si nécessaire.

    Node.js

    Si votre application a besoin d'un accès hors connexion à une API Google, définissez le type d'accès du client API sur offline :

    const authorizationUrl = oauth2Client.generateAuthUrl({
      // 'online' (default) or 'offline' (gets refresh_token)
      access_type: 'offline',
      /** Pass in the scopes array defined above.
        * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
      scope: scopes,
      // Enable incremental authorization. Recommended as a best practice.
      include_granted_scopes: true
    });
    

    Une fois qu'un utilisateur a accordé un accès hors connexion aux champs d'application demandés, vous pouvez continuer à utiliser le client API pour accéder aux API Google au nom de l'utilisateur lorsque celui-ci est hors connexion. L'objet client actualisera le jeton d'accès si nécessaire.

    Les jetons d'accès expirent. Cette bibliothèque utilisera automatiquement un jeton d'actualisation pour obtenir un nouveau jeton d'accès s'il est sur le point d'expirer. Un moyen simple de vous assurer de toujours stocker les jetons les plus récents consiste à utiliser l'événement des jetons:

    oauth2Client.on('tokens', (tokens) => {
      if (tokens.refresh_token) {
        // store the refresh_token in your secure persistent database
        console.log(tokens.refresh_token);
      }
      console.log(tokens.access_token);
    });

    Cet événement de jetons ne se produit que dans la première autorisation, et vous devez avoir défini votre access_type sur offline lorsque vous appelez la méthode generateAuthUrl pour recevoir le jeton d'actualisation. Si vous avez déjà accordé à votre application les autorisations requises sans définir les contraintes appropriées pour recevoir un jeton d'actualisation, vous devez à nouveau autoriser l'application à recevoir un nouveau jeton d'actualisation.

    Pour définir refresh_token ultérieurement, vous pouvez utiliser la méthode setCredentials:

    oauth2Client.setCredentials({
      refresh_token: `STORED_REFRESH_TOKEN`
    });
    

    Une fois que le client dispose d'un jeton d'actualisation, les jetons d'accès sont acquis et actualisés automatiquement lors du prochain appel à l'API.

    HTTP/REST

    Pour actualiser un jeton d'accès, votre application envoie une requête HTTPS POST au serveur d'autorisation de Google (https://oauth2.googleapis.com/token) qui inclut les paramètres suivants:

    Champs
    client_id ID client obtenu à partir de API Console.
    client_secret Code secret du client obtenu à partir de API Console.
    grant_type Comme défini dans la spécification OAuth 2.0, la valeur de ce champ doit être définie sur refresh_token.
    refresh_token Jeton d'actualisation renvoyé par l'échange de code d'autorisation.

    L'extrait de code suivant présente un exemple de requête:

    POST /token HTTP/1.1
    Host: oauth2.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=your_client_id&
    client_secret=your_client_secret&
    refresh_token=refresh_token&
    grant_type=refresh_token

    Tant que l'utilisateur n'a pas révoqué l'accès accordé à l'application, le serveur de jetons renvoie un objet JSON contenant un nouveau jeton d'accès. L'extrait de code suivant présente un exemple de réponse:

    {
      "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
      "expires_in": 3920,
      "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
      "token_type": "Bearer"
    }

    Notez que le nombre de jetons d'actualisation pouvant être émis est limité : une par client et par utilisateur, et une autre par utilisateur pour tous les clients. Vous devez enregistrer les jetons d'actualisation dans un espace de stockage à long terme et continuer à les utiliser tant qu'ils restent valides. Si votre application demande trop de jetons d'actualisation, elle peut dépasser ces limites. Le cas échéant, les anciens jetons d'actualisation ne fonctionneront plus.

    Révoquer un jeton

    Dans certains cas, l'utilisateur peut révoquer l'accès accordé à une application. Un utilisateur peut révoquer l'accès en accédant aux paramètres de compte. Pour en savoir plus, consultez la section Supprimer l'accès aux sites et applications du document d'assistance relatif aux applications et sites tiers ayant accès à votre compte.

    Une application peut également révoquer automatiquement l'accès qui lui est accordé. La révocation programmatique est importante dans les cas où un utilisateur se désabonne, supprime une application ou a considérablement modifié les ressources d'API requises par une application. En d'autres termes, une partie du processus de suppression peut inclure une requête API pour s'assurer que les autorisations précédemment accordées à l'application sont supprimées.

    PHP

    Pour révoquer automatiquement un jeton, appelez revokeToken():

    $client->revokeToken();

    Python

    Pour révoquer automatiquement un jeton, envoyez une requête à https://oauth2.googleapis.com/revoke, qui inclut le jeton en tant que paramètre et définit l'en-tête Content-Type:

    requests.post('https://oauth2.googleapis.com/revoke',
        params={'token': credentials.token},
        headers = {'content-type': 'application/x-www-form-urlencoded'})

    Ruby

    Pour révoquer automatiquement un jeton, envoyez une requête HTTP au point de terminaison oauth2.revoke:

    uri = URI('https://oauth2.googleapis.com/revoke')
    response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
    

    Le jeton peut être un jeton d'accès ou un jeton d'actualisation. Si le jeton est un jeton d'accès et qu'il possède un jeton d'actualisation correspondant, il est également révoqué.

    Si la révocation a bien été traitée, le code d'état de la réponse est 200. Pour les conditions d'erreur, un code d'état 400 est renvoyé avec un code d'erreur.

    Node.js

    Pour révoquer automatiquement un jeton, envoyez une requête HTTPS POST au point de terminaison /revoke:

    const https = require('https');
    
    // Build the string for the POST request
    let postData = "token=" + userCredential.access_token;
    
    // Options for POST request to Google's OAuth 2.0 server to revoke a token
    let postOptions = {
      host: 'oauth2.googleapis.com',
      port: '443',
      path: '/revoke',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    
    // Set up the request
    const postReq = https.request(postOptions, function (res) {
      res.setEncoding('utf8');
      res.on('data', d => {
        console.log('Response: ' + d);
      });
    });
    
    postReq.on('error', error => {
      console.log(error)
    });
    
    // Post the request with data
    postReq.write(postData);
    postReq.end();
    

    Le paramètre de jeton peut être un jeton d'accès ou un jeton d'actualisation. Si le jeton est un jeton d'accès et qu'il possède un jeton d'actualisation correspondant, il est également révoqué.

    Si la révocation a bien été traitée, le code d'état de la réponse est 200. Pour les conditions d'erreur, un code d'état 400 est renvoyé avec un code d'erreur.

    HTTP/REST

    Pour révoquer automatiquement un jeton, votre application envoie une requête à https://oauth2.googleapis.com/revoke et inclut le jeton en tant que paramètre:

    curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
            https://oauth2.googleapis.com/revoke?token={token}

    Le jeton peut être un jeton d'accès ou un jeton d'actualisation. Si le jeton est un jeton d'accès et qu'il possède un jeton d'actualisation correspondant, il est également révoqué.

    Si la révocation a bien été traitée, le code d'état HTTP de la réponse est 200. Pour les conditions d'erreur, un code d'état HTTP 400 est renvoyé avec un code d'erreur.