ورود و عضویت کاربران در سایت با استفاده از گوگل اکانت در PHP

12 بهمن 1398
Login-Google-Using-PHP2

در این مقاله یادخواهید گرفت که چگونه می توانید به کاربران خود اجازه دهید با حساب گوگل با استفاده 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 در بالا سمت چپ کلیک کنید.

سایدبار Projects

  • در پنجره باز شده در بالا سمت راست بر روی “NEW PROJECT” کلیک کنید.

NEW PROJECT

  • بر روی “Create” کلیک کنید.

Create - لاگین در سایت با گوگل

  • در نوار کناری سمت چپ “Credentials” را انتخاب کنید.

Credentials - لاگین در سایت با گوگل

  • “OAuth consent screen” را کلیک نمائید.

OAuth consent screen - لاگین در سایت با گوگل

  • در “Application name” نام را وارد کنید.
  • در “Support email” آدرس gmail فعلی‌ تان را وارد کنید.
  • همچنین می‌ توانید از آدرس ایمیل های دیگر استفاده کنید.
  • در “Authorized domains” دامنه مورد استفاده خود را وارد کنید.
  • اگرمی‌ خواهید بصورت محلی تست کنید می‌ توانید lvh.me را که همان localhost است وارد کنید.
    فیلدهای دیگر را می‌توانید خالی بگذارید.
  • روی ذخیره کلیک کنید
  • سپس در برگه “Credentials” روی “Create credentials” و سپس “OAuth client ID” کلیک کنید.
  • سپس “Web application” را انتخاب کنید.

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

نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

faraz tahari
26 اردیبهشت 1401
فک میکنم دسترسی به سایت google api برای ایرانی ها بسته شده.؟؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.