Yalnızca web uygulamanızın bir ziyaretçisinin Google kullanıcı kimliğini, adını ve resmini getirmek istiyorsanız - işte 2020 yılı için harici kitaplık kullanılmadan saf PHP hizmet tarafı çözümüm -
Google'ın Web Sunucusu Uygulamaları için OAuth 2.0'ı Kullanma kılavuzunu okursanız (ve Google'ın kendi belgelerine giden bağlantıları değiştirmeyi sevdiğini unutmayın), yalnızca 2 adımı gerçekleştirmeniz gerekir:
- Ziyaretçiye, adını web uygulamanızla paylaşmak için izin isteyen bir web sayfası sunun
- Ardından, yukarıdaki web sayfasından geçen "kodu" web uygulamanıza alın ve Google'dan bir jeton (aslında 2) alın.
Döndürülen belirteçlerden biri "id_token" olarak adlandırılır ve ziyaretçinin kullanıcı kimliği, adı ve fotoğrafını içerir.
İşte benim yazdığım bir web oyununun PHP kodu . Başlangıçta Javascript SDK kullanıyordum, ancak daha sonra sahte kullanıcı verilerinin web oyunuma sadece istemci tarafı SDK kullanıldığında (özellikle oyunum için önemli olan kullanıcı kimliği) aktarılabileceğini fark ettim, bu yüzden kullanmaya geçtim Sunucu tarafında 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));
?>
JWT imzasını doğrulayarak ek güvenlik eklemek için bir PHP kitaplığı kullanabilirsiniz. Amaçlarım için gereksizdi çünkü Google'ın sahte ziyaretçi verileri göndererek küçük web oyunuma ihanet etmeyeceğine inanıyorum.
Ayrıca, ziyaretçinin daha fazla kişisel verilerini almak istiyorsanız, üçüncü bir adıma ihtiyacınız var:
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);
Veya kullanıcı adına daha fazla izin alabilirsiniz - Google API'leri için OAuth 2.0 Kapsamları dokümanındaki uzun listeye bakın .
Son olarak, kodumda kullanılan APP_ID ve APP_SECRET sabitleri - Google API konsolundan edinebilirsiniz :