با سلام خدمت دوستان عزیز و اساتید محترم.
چجوری با لاراول Passport کار کنیم؟ اصلا چی هست؟
دوستان فرض کنین شما دارین برای یک سایت و اپ اندروید برنامه نویسی میکنین و میخواین هردو(هم اپ هم سایت) با یه بار کدنویسی ساخته بشن! چجوری؟ API بدرد همین روزا میخوره.
خب حالا اوکی. میایم با Laravel مثلا این Backend api هارو اوکی میکنیم ولی یه چیزی میمونه. چجوری احراز هویت کاربر رو درست کنیم؟ چجوری کاری کنیم که یوقت از اکانت کاربر سو استفاده نشه؟ مثلا ریکوست ها از طرف ی هکر و ب نام یه کاربر سایت تموم نشه؟ میایم و از JWT یا Jason web token استفاده میکنیم. اینو به یاد داشته باشین که ما قراره هم برای اپ موبایل و هم سایت اینارو بنویسیم. پس نمیشه با سشن ست کردن این احراز هویت رو حل کرد.
خب حالا پیاده کردن این jwt بصورت خام یکم دردسر شاید داشته باشه ولی ما تا فریمورک لاراول رو داریم غمی نداریم (: Taylor outwell فکر همه جاشو کرده.
خب پس میایم برای هندل کردن این jwt از passport استفاده میکنیم.
طریقه نصب Passport از طریق کامپوزر (اگه نمیدونین کامپوزر چیه به این مطلب مراجعه کنین):
composer require laravel/passport
خب حالا کتابخونش به کامپوزر ما اضافه شد. خب حالا باید به service provider هامون اضافش بکنیم. (البته برای ورژن های Laravel بالای 5.8 لازم نیست). پس وارد فایل config/app.php میشیم.
config/app.php 'providers' => [ Laravel\Passport\PassportServiceProvider::class, ],
خب حالا لازمه که یک بار migration هامون رو اجرا کنیم. پس این دستور رو وارد میکنیم.
php artisan migrate
اوکی. ولی هنوز مونده یسری کاراش که باید انجام بدیم. مثلا توکن های لاراول پاسپورت رو جنریت کنیم
php artisan passport:install
عالیه! حالا باید بریم یه تغییرات جزیی به فایل مدل User بدیم. چرا؟ چون که قراره این مدل User ما بیاد و از یسری متود های یه کلاس دیگه ای استفاده کنه. پس میایم و تریت hasApiToken رو به فایل مدل User اضافه میکنیم.
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable { use HasApiTokens, Notifiable;/** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ];
/** * The attributes that should be hidden for arrays. * * @var array */protected $hidden = [ 'password', 'remember_token', ];
}
خب اگه توی کد بالا دقت کنین اون بخش هایی که بصورت بولد و ایتالیک هستن بخش هایی هستن که مربوط به hasApiToken هستن و ما ازشون قراره استفاده کنیم.
عالیه. الان باید روت های api روتعریف کنیم. پس فایل routes/api.php رو باز کنین و داخلش اینهارو بگذارین.
Route::post('login', 'API\UserController@login'); Route::post('register', 'API\UserController@register'); Route::group(['middleware' => 'auth:api'], function () { Route::post('details', 'API\UserController@details'); });
خب عالیه. حالا باید توی authServiceProvider این بخش رو اضافه کنیم.
Passport::routes();
که در نهایت تبدیل به این میشه
<?php
namespace App\Providers;
use Laravel\Passport\Passport; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', ];
/** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); } }
یه تیکه کوچیک دیگ از کانفیگش مونده! حالا باید توی config/auth.php بهش passport رو بدیم تا بفهمه api های ما قراره بر اساس اون هندل بشه
config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
عالیه. حالا کانفیگ ما انجام شد. حالا باید چیکار کنیم؟
بریم و کلاس کنترلری برای User تعریف کنیم.
php artisan make:controller UserController
خب حالا این کنترلر جایی هست که ما Login و register رو انجام میدیم.
پس یه تابع برای ورود و یه تابع برای رجیستر یوزر باید بنویسیم.
من شروع میکینم به نوشتن تابع لاگین
مراحل کار لاگین چجوریه؟ اول باید ببینه یوزر میتونه لاگین کنه یا نه؟ (یوزر پسورد رو اشتباه نزنه) بعدش باید براش یه token بسازیم. بعدش باید اون توکن رو برگردونیم.
public function login() { if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) { $token = auth()->user()->createToken('NewToken')->accessToken; return response()->json([ 'token' => $token, 'code' => 200 ]); }else{ return response()->json(['error'=>'Unauthorized']); } }
عالیه!! بریم سراغ نوشتن تابع register
این یکی مراحل کارش چجوریه؟ قراره اول ورودی هارو validate کنیم و بعدش اگه ورودی ها درست بود براش یه یوزر بسازیم و اون توکن رو برگردونیم.
public function register(Request $request) { $input = $request->all(); $validator = Validator::make($input, [ 'name' => 'required', 'email' => 'required:email|unique:users', 'password' => 'required', 'c_password' => 'required|same:password' ]); // if there is some error's, show to user if ($validator->fails()) { return response()->json([$validator->errors()->merge(['code'=>500])],500); } $user = User::create($input); $token = $user->createToken('NewToken')->accessToken; return response()->json([ 'token' => $token, ], 201); }
عالیه! نظرتون چیه با هم بریم تست کنیم اینهارو؟ خیلی خب کافیه Postman رو دانلود کنید و مثل عکس پایین براش body ست کنین و متود ریکوئست رو post بزارین
تنظیمات ارسال درخواست باید مطابق این باشه. همونطور که توی عکس میبینین با موفقیت لاگین شدیم و توکن برامون ارسال شد. خیلیم عالی. حالا بریم register رو تست کنیم
خیلی خب :) مثل اینکه کار ما تا اینجا به درستی پیش رفت. در پست بعدی حتما از این توابع استفاده بیشتری میکنیم
ممنون که تا اینجا همراه بودین. موفق باشین