Ce billet a pour but de vous montrer (et m'aider Ă me souvenir) comment utiliser Google OAuth sans librairies en 3 Ă©tapes :
- obtenir un token
code
directement via le navigateur - utilisez
cURL
pour obtenir unaccess_token
valide - utiliser
cURL
Ă nouveau pour Ă©changerrefresh_token
contre un tout nouveauaccess_token
sans interaction de l'utilisateur
Bien qu'il existe de nombreuses bibliothĂšques pour le faire, je vais vous montrer comment faire une requĂȘte OAuth en utilisant uniquement les outils en ligne de commande (cURL, Bash, etc...). Cela m'a aidĂ© Ă comprendre le fonctionnement d'OAuth et vous permettra de reproduire cet exemple complet sur n'importe quel environnement.
Je n'expliquerai pas comment fonctionne Oauth car de nombreuses ressources existent. Je suppose donc que vous avez quelques bases sur le fonctionnement de Oauth. Vous ĂȘtes prĂȘts ?
Je commence à définir quelques variables Bash pour les utiliser pendant cette session (cela fonctionnera aussi avec ZSH) :
# client id and secret obtained from Google API Console: https://console.developers.google.com/apis/credentials
export G_CLIENT_ID="xxxx-xxxx.apps.googleusercontent.com"
export G_CLIENT_SECRET="EW_iOOxxxx"
# redirect URL. You do not need any webserver for now because this will only allow us to copy the redirection URL provided by Google
export G_REDIRECT="http://localhost"
# Scope, that means actions you'll be able to make with obtained token (this is a space separated list)
export G_SCOPE="https://www.googleapis.com/auth/webmasters.readonly"
Ouvrez maintenant un onglet avec votre navigateur pour vous connecter Ă votre compte Google :
firefox "https://accounts.google.com/o/oauth2/auth?client_id=$G_CLIENT_ID&redirect_uri=$G_REDIRECT&scope=$G_SCOPE&response_type=code&access_type=offline"
Google redirige l'utilisateur dĂšs que vous acceptez le condition. Copiez rapidement l'URL de redirection et extrayez les paramĂštres HTTP du code
tel quel et exportez-les dans une session Bash :
export G_CODE="4/5gxxxx"
Ce code
nous permet uniquement d'obtenir un access_token
et un refresh_token
une fois avec cette commande cURL :
curl https://accounts.google.com/o/oauth2/token \
-d code=$G_CODE \
-d client_id=$G_CLIENT_ID \
-d client_secret=$G_CLIENT_SECRET \
-d redirect_uri=$G_REDIRECT \
-d access_type=offline \
-d grant_type=authorization_code
Vous devriez obtenir quelque chose de ce genre :
{
"access_token": "ya29.a0xxxx-xxxxx",
"expires_in": 3599,
"refresh_token": "1//03rWf_xxxx",
"scope": "https://www.googleapis.com/auth/webmasters.readonly",
"token_type": "Bearer"
}
Quelques notes Ă propos de ce qui vient de ce passer :
- Google ne vous enverra cette réponse qu'une seule fois. Si vous relancez cette commande, vous obtiendrez une difficile à interpreter:
invalid_grant
. - Il se peut que vous ne receviez pas de
refresh_token
. En effet, il n'est fourni que lors de la premiÚre autorisation de l'utilisateur. Si c'est le cas, allez à la page pour gérer les accÚs tiers à votre compte Google et supprimez l'accÚs à votre application. Ensuite reprenez tout depuis le début
TrĂšs bien, exportons la valeur et validons le jeton :
export G_ACCESS_TOKEN="ya29.a0xxxx"
export G_REFRESH_TOKEN="1//03rWf_xxxx"
curl -H "Authorization: Bearer $G_ACCESS_TOKEN" https://www.googleapis.com/oauth2/v3/tokeninfo
Vous devriez avoir une réponse de ce type :
{
"azp": "659549366751-xxxx.apps.googleusercontent.com",
"aud": "659549366751-xxxx.apps.googleusercontent.com",
"scope": "https://www.googleapis.com/auth/webmasters.readonly",
"exp": "1603813145",
"expires_in": "3162",
"access_type": "offline"
}
Essayons maintenant d'Ă©changer le refresh_token
pour obtenir un tout nouveau access_token
avec cette commande cURL :
curl https://accounts.google.com/o/oauth2/token \
--request POST \
-d client_id=$G_CLIENT_ID \
-d client_secret=$G_CLIENT_SECRET \
-d refresh_token=$G_REFRESH_TOKEN \
-d grant_type=refresh_token
Si ça a fonctionné, vous devriez obtenir une réponse de ce type.
So you'll obtain a response like this :
{
"access_token": "ya29.a0xxxx-xxxxx",
"expires_in": 3599,
"scope": "https://www.googleapis.com/auth/webmasters.readonly",
"token_type": "Bearer"
}
Et voilĂ !
Links
- Curl bash script for getting a Google Oauth2 Access token
- Using OAuth 2.0 to Access Google APIs - Google Identity Platform
- Google Sign-In JavaScript client reference
- Using OAuth 2.0 for Web Server Applications - Google Identity Platform
- OAuth 2.0 protocol
- Google OAuth âinvalid_grantâ nightmare â and how to fix it