سرفصل‌های آموزشی
آموزش OAuth و Laravel Passport
عملیات برروی Token

عملیات برروی Token

در بخش‌های قبل متوجه شدیم چگونه می‌توان از انواع روش های صدور مجوز، Access Token را به دست آورد. حال در این بخش به آشنایی با عملیات هایی می‌پردازیم که برروی توکن هایی که قرار است تولید شوند و یا این که تولید شده‌اند، اتفاق میافتند.

به طور پیش‌فرض Passport، طول عمر یک سال را برای access token‌ ها در نظر می‌گیرد و پس از یک سال منقضی می‌شوند. اگر می‌خواهید این مدت زمان را طولانی‌تر یا کوتاه‌تر کنید، می‌توانید از متد‌های tokensExpireIn ،refreshTokensExpireIn و personalAccessTokensExpireIn استفاده کنید.

 برای این کار در سرور Todo، فایل app/Providers/AuthServiceProvider.php/ را باز کنید. سپس در متد boot ، از متد‌های نام برده به صورت زیر استفاده کنید:

 

// … 

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Passport::tokensExpireIn(now()->addDays(15));

    Passport::refreshTokensExpireIn(now()->addDays(30));

    Passport::personalAccessTokensExpireIn(now()->addMonths(6));

// … 

ستون‌های expires_at در جداول پایگاه داده پاسپورت، read-only (فقط قابل خواندن) و فقط برای اهداف نمایش هستند. هنگام صدور توکن‌ها، پاسپورت اطلاعات مربوط به انقضا را در توکن‌های امضا شده و رمزگذاری شده ذخیره می‌کند. اگر لازم است یک توکن را باطل کنید باید آن را ابطال (revoke) کنید.

برای تست این بخش، ما مدت زمان انقضای یک توکن را برابر با 5 دقیقه قرار می‌دهیم بنابراین در تکه کد بالا و در متد boot مقدار زیر را وارد می‌کنیم: 

// …
public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Passport::tokensExpireIn(now()->addMinutes(5));
// …

حال روند ایجاد access token را یک بار دیگر طی می‌کنیم. یعنی در بخش تنظیمات برنامه Todo یک کلاینت جدید ایجاد کرده و مقدار ID و رمز آن را در مسیر‌های موجود در برنامه consumer ثبت می‌کنیم. سپس منتظر می‌مانیم که access token ای که برای برنامه consumer تولید شده است expire شود. یعنی مدت زمان 5 دقیقه صبر می‌کنیم. بعد از آن برنامه consumer را اجرا می‌کنیم، مجددا از ما می‌خواهد مراحل Authorize را طی کنیم. (می‌توانید به قسمت 15 دوره رجوع کنید.)

بنابراین اگر برنامه شما access token کوتاه مدت را صادر کند، کاربران باید با استفاده از refresh token که هنگام انتشار access token به آن‌ها ارائه شده، access token های خود را refresh کنند. در این مثال، ما از کتابخانه Guzzle HTTP برای refresh کردن access token استفاده خواهیم کرد:

 

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);


مسیر oauth/token/ یک پاسخ JSON شامل پارامترهای access_token و refresh_token و expires_in بر می‌گرداند.

پارامتر expires_in بیان‌می‌کند که چه مقدارتا زمان انقضا access token باقی مانده است.

 

Purging Tokens (پاکسازی توکن)


وقتی توکن‌ها باطل یا منقضی می‌شوند، می‌توانیم آن‌ها را از دیتابیس پاک کنیم. پاسپورت با یک دستور این کار را برای ما انجام می‌دهد. همان‌طور که در کادر زیر دیده می‌شود، 3 دستور برای این کار معرفی شده است. به ترتیب دستورات کار‌های زیر را انجام می‌دهند.

·         پاکسازی توکن‌های باطل شده یا منقضی شده و کد‌های تایید شده

·         پاکسازی فقط توکن‌های باطل شده و کدهای تایید شده

·         پاکسازی فقط توکن‌های منقضی شده و کدهای تایید

 

# Purge revoked and expired tokens and auth codes...
php artisan passport:purge

# Only purge revoked tokens and auth codes...
php artisan passport:purge --revoked

# Only purge expired tokens and auth codes...
php artisan passport:purge --expired

برای مثال با وارد کردن دستور اول در مسیر روت پروژه Todo، پیغامی مشابه شکل زیر نشان داده می‌شود:

 

علاوه بر دستورات ذکر شده، می‌توانیم یک scheduled job را در کلاس Kernel واقع در مسیر app/Console/ پیکربندی کنیم تا به طور خودکار توکن‌های ما را در یک برنامه پاکسازی کند. برای این کار فایل Kernel.php را باز کرده و متد schedule آن را به صورت زیر می‌نویسیم:

// …

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    $schedule->command('passport:purge')->hourly();
}

// …
online-support-icon