در این مقاله یادخواهید گرفت که چگونه می توانید به کاربران خود اجازه دهید با حساب گوگل با استفاده Google PHP Client نسخه 2 به سایت پی اچ پی تان وارد شوند. فرض بر این است که شما از قبل composer را نصب کرده اید و در حال استفاده php نسخه بالاتر از 5.4 هستید. برای مشاهده کل کد، لطفا به این قسمت مراجعه کنید.
برای شروع به Client ID و Client Secret نیاز داریم. برای این کار باید یک پروژه در Google API console ایجاد کنیم. مراحل گام به گام را دنبال کنید.
به راحتی بر “Create” کلیک کنید تا آدرس دامنه خود را جایگزین کنید.
در مدول نمایش داده شده، Client ID و Client Secret را یادداشت کنید. ما به اسکریپت ورود به سیستم نیاز داریم.
گوگل كتابخانه پی اچ پی ای را ارائه داده كه توابع بسیاری را برای تعامل با API های Google با استفاده از OAuth2 فراهم كرده است. بیایید جلوتر برویم و آن را نصب کنیم.
فرض بر این است که ریشه پروژه شما در var/www/html قرار دارد.
cd /var/www/html composer require google/apiclient:"^2.0"
یک فایل login.php ایجاد کنید.
فایل vendor/autoload.php را include کنید تا بتوانیم کتابخانه گوگل را که با استفاده از Composer نصب کردیم اضافه کنیم.
<?php // Turn ON error reporting error_reporting(E_ALL); ini_set('display_errors', 1); // include autoload.php for including Google client library installed using composer require('vendor/autoload.php');
اکنون بیایید برخی ثابت ها را برای Google Client ID و Google Client Secret تعریف کنیم.
define('GOOGLE_CLIENT_ID', 'enter-google-client-id'); define('GOOGLE_CLIENT_SECRET', 'enter-google-client-secret'); define('GOOGLE_REDIRECT_URL', 'http://lvh.me/login.php');
قسمت GOOGLE_REDIRECT_URL آدرس فعلی اسکریپت login.php است.
به راحتی آدرس دامنه خود را جایگزین کنید.
اکنون بیایید نمونه جدیدی از Google client ایجاد کنیم.
$client = new Google_Client(); $client->setApplicationName('Sample Google Login by Perials'); $client->setClientId(GOOGLE_CLIENT_ID); $client->setClientSecret(GOOGLE_CLIENT_SECRET); $client->setRedirectUri(GOOGLE_REDIRECT_URL);
ورود به سیستم گوگل، کاربر را با کد درخواست رشته ای هدایت می کند. برای تولید OAuth2 به این نیاز خواهیم داشت.
if (isset($_GET['code'])) { $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); // store the token in Session $_SESSION['access_token'] = $token; }
هر وقت کد رشته ای در رشته پرس و جو داریم کد آن را واکشی و یک جلسه را تنظیم می کنیم. اگر Session تنظیم شود، فرض خواهیم کرد که کاربر وارد سیستم شده است. اگر نه، آدرس اینترنتی ورود به سیستم را به او نشان می دهیم.
// if access_token session is set then user has already logged in if($_SESSION['access_token']) { $attributes = $client->verifyIdToken($_SESSION['access_token']['id_token'], GOOGLE_CLIENT_ID); print_r($attributes); // Above will print an array which should contain below keys // name // picture // email } else { $scopes = [ Google_Service_Oauth2::USERINFO_PROFILE, Google_Service_Oauth2::USERINFO_EMAIL ]; $authUrl = $client->createAuthUrl($scopes); ?> <a href="<?php echo $authUrl; ?>">Click to login via Google</a> <?php }
لطفاً توجه داشته باشید که ما به همه موارد خطا رسیدگی نکرده ایم. مثلاً اگر در متن پرس و جو کد هر مقدار نامعتبری دریافت شود، در اسکریپت فعلی باید به آن رسیدگی شود.
خطای {Error – Cannot handle token prior to {date
معمولاً کد فوق به خوبی کار می کند اما اگر ساعت سرور برنامه و ساعت سرور auth شما همگام نباشند، ممکن است پیامی شبیه این در مرورگر برای شما نمایش داده شود:
Cannot handle token prior to 2019-05-02T13:01:09-0800
این خطا هنگام ورود کاربر به حساب google خود ظاهر می شود و به برنامه شما هدایت می شود.
این امر در stackoverflow گزارش شده و ظاهراً این مشکل رفع شده است. اما اگر زمان سرور شما از همگام سازی خارج شده است (منطقه زمانی دیگری را هم تنظیم کنید)، ممکن است باز هم با این مشکل روبرو شوید.
در زیر راه حل این مسئله آورده شده است. بر خلاف راه حل های ذکر شده در انجمن های فوق، ما نمی خواهیم هیچ تماسی با پرونده ای در vendor (ایجاد شده توسط composer) داشته باشیم.
در کد بالا، بجای خط زیر:
$client = new Google_Client();
سطرهای زیر جایگزین کنید:
// this is fix for leeway issue with JWT token $jwt = new Firebase\JWT\JWT; $jwt::$leeway = 5; // adjust this value // we explicitly pass jwt object whose leeway is set to 5 $this->client = new Google_Client(['jwt' => $jwt]);
برای بارگیری کامل کد لاگین در سایت با گوگل لطفاً به این gist مراجعه کنید.
منبع: سایت Perials
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.