यदि आप केवल अपने वेब ऐप के आगंतुक के लिए Google उपयोगकर्ता आईडी, नाम और चित्र लाना चाहते हैं - तो यहां वर्ष 2020 के लिए मेरा शुद्ध PHP सेवा साइड सॉल्यूशन है जिसमें कोई बाहरी लाइब्रेरी नहीं है -
यदि आप Google द्वारा वेब सर्वर एप्लिकेशन गाइड के लिए OAuth 2.0 का उपयोग करना पढ़ते हैं (और सावधान रहें, Google अपने स्वयं के प्रलेखन के लिंक बदलना पसंद करता है), तो आपको केवल 2 चरण करने होंगे:
- आगंतुक को अपने वेब ऐप के साथ उसका नाम साझा करने के लिए सहमति मांगने वाला एक वेब पेज प्रस्तुत करें
- फिर उपरोक्त वेब पेज द्वारा पारित "कोड" को अपने वेब ऐप पर ले जाएं और Google से एक टोकन (वास्तव में 2) प्राप्त करें।
लौटे हुए टोकन में से एक को "id_token" कहा जाता है और इसमें यूजर आईडी, आगंतुक का नाम और फोटो होता है।
यहाँ मेरे द्वारा वेब गेम का PHP कोड है । प्रारंभ में मैं जावास्क्रिप्ट एसडीके का उपयोग कर रहा था, लेकिन फिर मैंने देखा है कि नकली उपयोगकर्ता डेटा को मेरे वेब गेम में पारित किया जा सकता है, जब केवल क्लाइंट साइड एसडीके (विशेष रूप से उपयोगकर्ता आईडी, जो मेरे गेम के लिए महत्वपूर्ण है) का उपयोग कर रहा है, इसलिए मैंने उपयोग करना बंद कर दिया है सर्वर की ओर 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 हस्ताक्षर की पुष्टि करके अतिरिक्त सुरक्षा जोड़ने के लिए एक PHP लाइब्रेरी का उपयोग कर सकते हैं। मेरे उद्देश्यों के लिए यह अनावश्यक था, क्योंकि मुझे विश्वास है कि 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);
या आप उपयोगकर्ता की ओर से अधिक अनुमतियाँ प्राप्त कर सकते हैं - Google API के लिए OAuth 2.0 स्कोप की लंबी सूची देखें ।
अंत में, मेरे कोड में प्रयुक्त APP_ID और APP_SECRET स्थिरांक - आपको Google API कंसोल से प्राप्त होते हैं :