Si vous souhaitez uniquement récupérer l'identifiant d'utilisateur Google, le nom et l'image d'un visiteur de votre application Web - voici ma solution côté service PHP pure pour l'année 2020 sans bibliothèques externes utilisées -
Si vous lisez le guide Utiliser OAuth 2.0 pour les applications serveur Web de Google (et attention, Google aime modifier les liens vers sa propre documentation), alors vous devez effectuer seulement 2 étapes:
- Présentez au visiteur une page Web demandant le consentement pour partager son nom avec votre application Web
- Ensuite, prenez le "code" transmis par la page Web ci-dessus à votre application Web et récupérez un jeton (en fait 2) de Google.
L'un des jetons retournés s'appelle "id_token" et contient l'ID utilisateur, le nom et la photo du visiteur.
Voici le code PHP d' un jeu Web par moi. Au départ, j'utilisais le SDK Javascript, mais j'ai ensuite remarqué que de fausses données utilisateur pouvaient être transmises à mon jeu Web, lorsque j'utilisais uniquement le SDK côté client (en particulier l'ID utilisateur, qui est important pour mon jeu), j'ai donc opté pour PHP côté serveur:
<?php
const APP_ID = '1234567890-abcdefghijklmnop.apps.googleusercontent.com';
const APP_SECRET = 'abcdefghijklmnopq';
const REDIRECT_URI = 'https://the/url/of/this/PHP/script/';
const LOCATION = 'Location: https://accounts.google.com/o/oauth2/v2/auth?';
const TOKEN_URL = 'https://oauth2.googleapis.com/token';
const ERROR = 'error';
const CODE = 'code';
const STATE = 'state';
const ID_TOKEN = 'id_token';
# use a "random" string based on the current date as protection against CSRF
$CSRF_PROTECTION = md5(date('m.d.y'));
if (isset($_REQUEST[ERROR]) && $_REQUEST[ERROR]) {
exit($_REQUEST[ERROR]);
}
if (isset($_REQUEST[CODE]) && $_REQUEST[CODE] && $CSRF_PROTECTION == $_REQUEST[STATE]) {
$tokenRequest = [
'code' => $_REQUEST[CODE],
'client_id' => APP_ID,
'client_secret' => APP_SECRET,
'redirect_uri' => REDIRECT_URI,
'grant_type' => 'authorization_code',
];
$postContext = stream_context_create([
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($tokenRequest)
]
]);
# Step #2: send POST request to token URL and decode the returned JWT id_token
$tokenResult = json_decode(file_get_contents(TOKEN_URL, false, $postContext), true);
error_log(print_r($tokenResult, true));
$id_token = $tokenResult[ID_TOKEN];
# Beware - the following code does not verify the JWT signature!
$userResult = json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $id_token)[1]))), true);
$user_id = $userResult['sub'];
$given_name = $userResult['given_name'];
$family_name = $userResult['family_name'];
$photo = $userResult['picture'];
if ($user_id != NULL && $given_name != NULL) {
# print your web app or game here, based on $user_id etc.
exit();
}
}
$userConsent = [
'client_id' => APP_ID,
'redirect_uri' => REDIRECT_URI,
'response_type' => 'code',
'scope' => 'profile',
'state' => $CSRF_PROTECTION,
];
# Step #1: redirect user to a the Google page asking for user consent
header(LOCATION . http_build_query($userConsent));
?>
Vous pouvez utiliser une bibliothèque PHP pour ajouter une sécurité supplémentaire en vérifiant la signature JWT. Pour mes besoins, ce n'était pas nécessaire, car je suis convaincu que Google ne trahira pas mon petit jeu Web en envoyant de fausses données de visiteurs.
De plus, si vous souhaitez obtenir plus de données personnelles du visiteur, vous avez besoin d'une troisième étape:
const USER_INFO = 'https://www.googleapis.com/oauth2/v3/userinfo?access_token=';
const ACCESS_TOKEN = 'access_token';
# Step #3: send GET request to user info URL
$access_token = $tokenResult[ACCESS_TOKEN];
$userResult = json_decode(file_get_contents(USER_INFO . $access_token), true);
Ou vous pouvez obtenir plus d'autorisations au nom de l'utilisateur - voir la longue liste dans le document OAuth 2.0 Scopes for Google APIs .
Enfin, les constantes app_id et APP_SECRET utilisées dans mon code - vous l' obtenez à partir de la console API Google :