Wenn Sie nur die Google-Benutzer-ID, den Namen und das Bild für einen Besucher Ihrer Web-App abrufen möchten, finden Sie hier meine reine PHP-Service-Side-Lösung für das Jahr 2020, ohne dass externe Bibliotheken verwendet werden.
Wenn Sie das Handbuch Verwenden von OAuth 2.0 für Webserver-Anwendungen von Google lesen (und beachten Sie, dass Google gerne Links zu seiner eigenen Dokumentation ändert), müssen Sie nur zwei Schritte ausführen:
- Präsentieren Sie dem Besucher eine Webseite, auf der er um die Zustimmung gebeten wird, seinen Namen mit Ihrer Web-App zu teilen
- Nehmen Sie dann den von der obigen Webseite übergebenen "Code" an Ihre Web-App und rufen Sie einen Token (tatsächlich 2) von Google ab.
Einer der zurückgegebenen Token heißt "id_token" und enthält die Benutzer-ID, den Namen und das Foto des Besuchers.
Hier ist der PHP-Code eines Web-Spiels von mir. Ursprünglich habe ich Javascript SDK verwendet, aber dann habe ich festgestellt, dass gefälschte Benutzerdaten an mein Webspiel übergeben werden können, wenn nur clientseitiges SDK verwendet wird (insbesondere die Benutzer-ID, die für mein Spiel wichtig ist). Daher habe ich auf Verwendung umgestellt PHP auf der Serverseite:
<?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));
?>
Sie können eine PHP-Bibliothek verwenden, um zusätzliche Sicherheit zu schaffen, indem Sie die JWT-Signatur überprüfen. Für meine Zwecke war dies unnötig, da ich darauf vertraue, dass Google mein kleines Web-Spiel nicht durch das Senden gefälschter Besucherdaten verrät.
Wenn Sie mehr persönliche Daten des Besuchers erhalten möchten, benötigen Sie einen dritten Schritt:
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);
Oder Sie erhalten weitere Berechtigungen für den Benutzer. Weitere Informationen finden Sie in der langen Liste im Dokument OAuth 2.0 Scopes for Google APIs .
Schließlich die in meinem Code verwendeten Konstanten APP_ID und APP_SECRET - Sie erhalten sie von der Google API-Konsole :