Jeśli chcesz pobrać tylko identyfikator użytkownika Google, nazwę i zdjęcie odwiedzającego Twoją aplikację internetową - oto moje rozwiązanie po stronie usługi PHP na rok 2020 bez użycia zewnętrznych bibliotek -
Jeśli przeczytałeś przewodnik Google Using OAuth 2.0 for Web Server Applications (i uważaj, Google lubi zmieniać linki do własnej dokumentacji), musisz wykonać tylko 2 kroki:
- Zaprezentuj odwiedzającemu stronę internetową z prośbą o zgodę na udostępnienie jej imienia i nazwiska Twojej aplikacji internetowej
- Następnie przenieś „kod” przekazany przez powyższą stronę internetową do swojej aplikacji internetowej i pobierz token (a właściwie 2) z Google.
Jeden ze zwróconych tokenów nosi nazwę „id_token” i zawiera identyfikator użytkownika, imię i nazwisko oraz zdjęcie odwiedzającego.
Oto kod PHP mojej gry internetowej . Początkowo korzystałem z Javascript SDK, ale potem zauważyłem, że fałszywe dane użytkownika mogą być przekazywane do mojej gry internetowej, gdy używam tylko SDK po stronie klienta (szczególnie identyfikator użytkownika, który jest ważny dla mojej gry), więc przełączyłem się na używanie PHP po stronie serwera:
<?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));
?>
Możesz użyć biblioteki PHP, aby zwiększyć bezpieczeństwo, weryfikując podpis JWT. Dla moich celów było to niepotrzebne, ponieważ ufam, że Google nie zdradzi mojej małej gry internetowej, wysyłając fałszywe dane odwiedzających.
Ponadto, jeśli chcesz uzyskać więcej danych osobowych odwiedzającego, potrzebujesz trzeciego kroku:
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);
Możesz też uzyskać więcej uprawnień w imieniu użytkownika - zobacz długą listę w dokumencie OAuth 2.0 Scopes for Google APIs .
Na koniec stałe APP_ID i APP_SECRET użyte w moim kodzie - otrzymujesz to z konsoli Google API :