در بخشهای قبلی این دوره آموختیم که چگونه یک Auth Server را به وسیله ی Passport در لاراول راه اندازی کنیم. حال در این بخش میخواهیم از آن استفاده کرده و برای یک کلاینت دیگری که میخواهد از برنامه ی ما استفاده کند، توکن صادر کنیم. برای صدور توکن از همان روالی که passport در اختیار ما قرار داده است و در برنامه ی Todo ما وجود دارد استفاده میکنیم. برای تست این موضوع باید یک کلاینت جدید را راه اندازی کنیم که وظیفه ی آن دسترسی به ToDo و گرفتن لیست تَسکهای یک نفر است. نام این برنامه را Consumer در نظر گرفتیم. این برنامه به این صورت عمل میکند که کاربر، موقعی که میخواهد در آن لاگین کند به برنامه ی ToDo ری دایرکت میشود و اجازه ی دسترسی از کاربر پرسیده میشود. درصورتی که کاربر مجوز را صادر کرد، Access Token برای Consumer توسط Todo صادر میشود و Consumer میتواند از آن برای گرفتن لیست تَسک ها استفاده کند.
آنچه که گفتیم خلاصه ای بود از هر آنچه که در این بخش میخواهیم توضیح بدهیم. حال با ما همراه باشید تا مرحله به مرحله پیش برویم:
ایجاد یک کلاینت در سرور OAuth
در این بخش میخواهیم یک کلاینت جدید ایجاد کنیم. در صفحه تنظیمات روی لینک Create New Client کلیک کرده و یک برنامه OAuth جدید ایجاد میکنیم. در شکل زیر یک پنجره برای ما باز میشود که مربوط به ایجاد کلاینت جدید است. (توجه کنید که ما در ادامه، این برنامه کلاینت را به عنوان یک برنامه مستقل ایجاد خواهیم کرد.)
در این پنجره، مقدار نام Consumer را به عنوان Name (در این جا نام برنامه کلاینت ما میباشد اما میتوانید نام دلخواه خود را انتخاب کنید.) و مقدار redirect url را با مقدار http://127.0.0.1:8001/callback
تنظیم و بر روی دکمه ی Create کلیک میکنیم.
توجه کنید که در ادامه، هنگام ایجاد برنامه Consumer، آدرس callback واقعی، redirect_url خواهد بود. بعد از ایجاد برنامه Consumer به عنوان یک کلاینت جدید، مانند شکل زیر باید کلاینت خود را با Client ID و Secret در صفحه تنظیمات ببینیم. ما از این اطلاعات برای تست برنامه consumer که در ادامه ایجاد میکنیم، استفاده خواهیم کرد.
در مرحله آخر بر روی کلید Create New Token کلیک کرده و در پنجره باز شده نام کلاینت خود را وارد میکنیم تا برای آن token ایجاد شود.
سپس در صفحه تنظیمات، token ایجاد شده برای برنامه کلاینت را خواهیم دید:
تست فعال کردن برنامه کاربردی در سرور OAuth پاسپورت لاراول
همانطور که در بخش قبل ذکر شد، برای تست سرور OAuth خود، باید یک برنامه جداگانه ایجاد کنیم که به هیچ وجه به سرور OAuth2 وصل نشده باشد. یعنی باید یک برنامه جدا بسازیم که به برنامه todo مرتبط نبوده و یک پروژه مستقل باشد. در حقیقت این برنامه نوعی کلاینت برای سامانهی todo است. این برنامه همان برنامهای است که در بخش قبل از آن با نام consumer صحبت کردیم. با استفاده از دستور زیر یک پروژه جدید لاراول به نام consumer را خارج از برنامه فعلی todo ایجاد میکنیم:
laravel new consumer
بعد از نصب موفقیت آمیز برنامه consumer، Guzzle را نصب میکنیم. ما برای انجام درخواست HTTP به این پکیج نیاز داریم:
composer require guzzlehttp/guzzle
پس از این که نصب پکیج به پایان رسید، تنظیمات فایل .env برنامه consumer را انجام داده و از پورت دیگری برای آدرس آن استفاده کنید چون نیاز است سرور دیگری را اجرا کنیم. همانطور که مشاهده میکنید ما از پورت 8001 استفاده کردهایم.
APP_URL=http://localhost:8001
سپس دستور زیر را اجرا کنید تا سرور PHP دیگری با استفاده از artisan شروع شود که مربوط به برنامه consumer ما خواهد بود.
php artisan serve --port=8001
اگر آدرس مورد نظر را در مرورگر اجرا کنید، برنامه جدید لاراول در حال اجرا میباشد.
در برنامه consumer ما به سه مسیر نیاز داریم:
1- مسیری برای گرفتن مجوز از کاربر: در این مسیر باید یک درخواست به مسیر /oauth/authorize برنامه todo زده شود تا کاربر به برنامه todo منتقل شود و دسترسی برنامه consumer را تایید کند.
2- مسیری برای دریافت access token: این همان مسیری است که کاربر بعد از تایید دسترسی برنامه consumer، به آن منتقل میشود. در این مسیر با کدی که از برنامه todo در درخواست به ما آمده است، یک درخواست به برنامه todo میزنیم تا access token را دریافت کنیم. بعد از دریافت، access token آن را در session قرار میدهیم و کاربر را به مسیر سوم redirect میکنیم.
3- مسیری برای نمایش لیست todo های کاربر: در این مسیر با استفاده از access token ای که در session داریم، به برنامه todo درخواست داده تا لیست todo های کاربر را دریافت کنیم و به آن نشان دهیم.
پس فایل routes/web.php/ را باز کرده و مسیر های زیر را در آن قرار میدهیم:
// …
Route::get('/', function () {
$query = http_build_query([
'client_id' => 7,
'redirect_uri' => 'http://127.0.0.1:8001/callback',
'response_type' => 'code',
'scope' => ''
]);
return redirect('http://127.0.0.1:8000/oauth/authorize?' . $query);
});
Route::get('/callback', function (Request $request) {
$response = (new GuzzleHttp\Client)->post('http://127.0.0.1:8000/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 7,
'client_secret' => 'JZti516Dq45bvDcO0RbBlIccVxRn3WL4v0mNZqJa',
'redirect_uri' => 'http://127.0.0.1:8001/callback',
'code' => $request->code,
]
]);
session()->put('token', json_decode((string)$response->getBody(), true));
return redirect('/todos');
});
Route::get('/todos', function () {
if (!session()->has('token')) {
return redirect('/');
}
$response = (new GuzzleHttp\Client)->get('http://127.0.0.1:8000/api/todos', [
'headers' => [
'Authorization' => 'Bearer ' . Session::get('token.access_token')
]
]);
return json_decode((string)$response->getBody(), true);
});
فقط دقت کنید که مقادیر Client ID و Secret که در مسیر های ذکر شده قرار داده شدهاند برابر با همان مقادیری است که ما در هنگام ایجاد کلاینت جدید در سرور OAuth به دست آوردیم. یعنی شما باید مقدار Client ID و Secret را که در هنگام ثبت برنامه کلاینت جدید به دست میآورید را در مسیرها جایگزین کنید.
بعد از این که مسیر ها را ثبت کردیم مجددا مسیر http://localhost:8001 را در مرورگر باز کنید. در این حالت به صفحه لاگین هدایت تا کاربر لاگین کند. بعد از لاگین، اگر برنامه کلاینت در سرور OAuth به عنوان کلاینت جدید ثبت نشده باشد، با پیغامی مشابه شکل زیر مواجه میشویم:
از آن جایی که ما قبلا برنامه کلاینت خود را در سرور OAuth ثبت کردیم نباید با این خطا مواجه شویم و باید مشابه شکل زیر را مشاهده میکنیم.
با کلیک بر روی کلید Authorize، درخواست مجوز تایید شده و به todo های کاربر دسترسی خواهیم داشت که مشابه خروجی شکل زیر را میبینیم:
اگر وارد صفحه تنظیمات شوید، مشابه شکل زیر را مشاهده خواهید کرد که برنامههای احراز هویت شده را نشان میدهد. میتوانید مجوز کلاینت را لغو نمایید:
شما موفق شدید یک کلاینت third-party را از طریق استاندارد OAuth به برنامه ی اصلی متصل و از آن استفاده کنید. متوجه شدید که Passport تا چه اندازه کار را برای پیش برد این هدف راحت کرد. در ادامه ی دور با حالت های پیشرفته Passport آشنا خواهید شد.