Якщо ви хочете лише отримати ідентифікатор користувача, ім’я та зображення Google для відвідувача вашого веб-додатка - ось моє чисте рішення щодо послуги PHP на 2020 рік без використання зовнішніх бібліотек -
Якщо ви ознайомилися з посібником Google щодо використання програм OAuth 2.0 для веб-серверів (і будьте обережні, Google любить змінювати посилання на власну документацію), то вам доведеться виконати лише два кроки:
- Представте відвідувачу веб-сторінку з проханням дати згоду поділитися її іменем з вашим веб-додатком
- Потім візьміть "код", переданий вищевказаною веб-сторінкою, у ваш веб-додаток та отримайте маркер (фактично 2) від Google.
Один із повернених жетонів називається "id_token" і містить ідентифікатор користувача, ім'я та фотографії відвідувача.
Ось PHP-код веб-гри мною. Спочатку я використовував Javascript SDK, але потім я помітив, що підроблені дані користувачів можуть передаватися моїй веб-грі, лише коли використовується клієнтський SDK (особливо ідентифікатор користувача, що важливо для моєї гри), тому я перейшов на використання PHP на стороні сервера:
<?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));
?>
Ви можете використовувати бібліотеку PHP, щоб додати додатковий захист, перевіривши підпис JWT. Для моїх цілей це було непотрібно, оскільки я вірю, що Google не зрадить мою маленьку веб-гру, надіславши фальшиві дані про відвідувачів.
Крім того, якщо ви хочете отримати більше особистих даних відвідувача, вам потрібен третій крок:
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);
Або ви можете отримати більше дозволів від імені користувача - дивіться довгий список в OAuth 2.0 Області застосування API API Google .
Нарешті, константи APP_ID та APP_SECRET, які використовуються в моєму коді - ви отримуєте це з консолі API Google :