Si vous souhaitez uniquement récupérer l'identifiant, le nom et la photo de l'utilisateur Google pour un visiteur de votre application web - voici ma solution côté service PHP pure pour l'année 2020 sans utiliser de bibliothèques externes -
Si vous lisez le guide Utilisation de OAuth 2.0 pour les applications serveur Web de Google (et attention, Google aime changer les liens vers sa propre documentation), alors vous n'avez qu'à effectuer 2 étapes :
- Présenter au visiteur une page web demandant son consentement pour partager son nom avec votre application web
- Ensuite, prendre le "code" transmis par la page web ci-dessus vers votre application web et récupérer un jeton (en fait, 2) depuis Google.
Un des jetons retournés est appelé "id_token" et contient l'identifiant de l'utilisateur, le nom et la photo du visiteur.
Voici le code PHP d'un jeu web que j'ai créé. Initialement j'utilisais le SDK Javascript, mais ensuite j'ai remarqué que des données utilisateur factices pouvaient être transmises à mon jeu web en utilisant uniquement le SDK côté client (surtout l'identifiant utilisateur, qui est important pour mon jeu), donc j'ai basculé vers l'utilisation de PHP côté serveur :
$_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)
]
]);
# Étape #2 : envoyer une requête POST à l'URL du jeton et décoder le JWT id_token retourné
$tokenResult = json_decode(file_get_contents(TOKEN_URL, false, $postContext), true);
error_log(print_r($tokenResult, true));
$id_token = $tokenResult[ID_TOKEN];
# Attention - le code suivant ne vérifie pas la signature JWT !
$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) {
# afficher votre application web ou votre jeu ici, basé sur $user_id etc.
exit();
}
}
$userConsent = [
'client_id' => APP_ID,
'redirect_uri' => REDIRECT_URI,
'response_type' => 'code',
'scope' => 'profile',
'state' => $CSRF_PROTECTION,
];
# Étape #1 : rediriger l'utilisateur vers la page Google demandant le consentement de l'utilisateur
header(LOCATION . http_build_query($userConsent));
?>
Vous pourriez utiliser une bibliothèque PHP pour ajouter une sécurité supplémentaire en vérifiant la signature JWT. Pour mes besoins, cela était inutile, car je fais confiance à Google pour ne pas trahir mon petit jeu web en envoyant des données visiteur fausses.
Aussi, si vous souhaitez obtenir plus de données personnelles du visiteur, alors 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';
# Étape #3 : envoyer une requête GET à l'URL des informations utilisateur
$access_token = $tokenResult[ACCESS_TOKEN];
$userResult = json_decode(file_get_contents(USER_INFO . $access_token), true);
Ou vous pourriez obtenir plus de permissions au nom de l'utilisateur - voir la longue liste dans la documentation Portées OAuth 2.0 pour les API Google.
Enfin, les constantes APP_ID et APP_SECRET utilisées dans mon code - vous les obtenez de la console API Google:
![capture d'écran]()