در این مقاله یادخواهید گرفت که چگونه می توانید به کاربران خود اجازه دهید با حساب گوگل با استفاده Google PHP Client نسخه 2 به سایت پی اچ پی تان وارد شوند. فرض بر این است که شما از قبل composer را نصب کرده اید و در حال استفاده php نسخه بالاتر از 5.4 هستید. برای مشاهده کل کد، لطفا به این قسمت مراجعه کنید.
ایجاد OAuth 2.0 Client ID و Secret Key
برای شروع به Client ID و Client Secret نیاز داریم. برای این کار باید یک پروژه در Google API console ایجاد کنیم. مراحل گام به گام را دنبال کنید.
- به Google API Console بروید.
- بروی سایدبار Projects در بالا سمت چپ کلیک کنید.
- در پنجره باز شده در بالا سمت راست بر روی “NEW PROJECT” کلیک کنید.
- بر روی “Create” کلیک کنید.
- در نوار کناری سمت چپ “Credentials” را انتخاب کنید.
- “OAuth consent screen” را کلیک نمائید.
- در “Application name” نام را وارد کنید.
- در “Support email” آدرس gmail فعلی تان را وارد کنید.
- همچنین می توانید از آدرس ایمیل های دیگر استفاده کنید.
- در “Authorized domains” دامنه مورد استفاده خود را وارد کنید.
- اگرمی خواهید بصورت محلی تست کنید می توانید lvh.me را که همان localhost است وارد کنید.
فیلدهای دیگر را میتوانید خالی بگذارید. - روی ذخیره کلیک کنید
- سپس در برگه “Credentials” روی “Create credentials” و سپس “OAuth client ID” کلیک کنید.
- سپس “Web application” را انتخاب کنید.
- یک نام را در “Name” وارد کنید.
- هر آدرسی در “Authorized redirect URIs” مشخص شده باشد، گوگل با برخی از داده های تأیید اعتبار، کاربر را به این آدرس هدایت می کند. بنابراین اگر این کار را به صورت محلی انجام می دهید، می توانید http://lvh.me/login.php را مشخص کنید. ما به زودی اسکریپت login.php را ایجاد می کنیم.
به راحتی بر “Create” کلیک کنید تا آدرس دامنه خود را جایگزین کنید.
در مدول نمایش داده شده، Client ID و Client Secret را یادداشت کنید. ما به اسکریپت ورود به سیستم نیاز داریم.
کتابخانه Google Client
گوگل کتابخانه پی اچ پی ای را ارائه داده که توابع بسیاری را برای تعامل با 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