Jika Anda hanya ingin mengambil ID pengguna Google, nama dan gambar untuk pengunjung aplikasi web Anda - berikut adalah solusi sisi layanan PHP murni saya untuk tahun 2020 tanpa menggunakan pustaka eksternal -
Jika Anda membaca panduan Menggunakan OAuth 2.0 untuk Aplikasi Server Web oleh Google (dan berhati-hatilah, Google suka mengubah tautan ke dokumentasinya sendiri), maka Anda hanya perlu melakukan 2 langkah:
- Tampilkan halaman web kepada pengunjung yang meminta izin untuk membagikan namanya dengan aplikasi web Anda
- Kemudian ambil "kode" yang diteruskan oleh halaman web di atas ke aplikasi web Anda dan ambil token (sebenarnya 2) dari Google.
Salah satu token yang dikembalikan disebut "id_token" dan berisi id pengguna, nama, dan foto pengunjung.
Berikut adalah kode PHP web game oleh saya. Awalnya saya menggunakan Javascript SDK, tetapi kemudian saya perhatikan bahwa data pengguna palsu dapat diteruskan ke game web saya, saat menggunakan SDK sisi klien saja (terutama ID pengguna, yang penting untuk game saya), jadi saya beralih menggunakan PHP di sisi server:
<?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));
?>
Anda dapat menggunakan pustaka PHP untuk menambahkan keamanan tambahan dengan memverifikasi tanda tangan JWT. Untuk tujuan saya itu tidak perlu, karena saya percaya bahwa Google tidak akan mengkhianati permainan web kecil saya dengan mengirimkan data pengunjung palsu.
Selain itu, jika Anda ingin mendapatkan lebih banyak data pribadi pengunjung, maka Anda memerlukan langkah ketiga:
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);
Atau Anda bisa mendapatkan lebih banyak izin atas nama pengguna - lihat daftar panjangnya di dokumen Cakupan OAuth 2.0 untuk Google API .
Terakhir, konstanta APP_ID dan APP_SECRET digunakan dalam kode saya - Anda mendapatkannya dari konsol Google API :