با سلام و احترام ،
با توجه به جستجو من در اینترنت ، برای ست کردن توکن و تاریخ انقضا میتوان از روشهای زیر با توجه به نیاز پروژه استفاده کرد :
- پکیج tymon/jwt-auth : مناسب برای ایجاد و مدیریت توکنهای JWT در لاراول
- پکیج firebase/php-jwt : کتابخانهای ساده و سبک برای ایجاد و بررسی توکنهای JWT
- Laravel Sanctum : برای APIهای ساده و احراز هویت سریع
- Laravel Passport : برای سیستمهای OAuth2 و احراز هویت پیشرفته
- Redis : برای ذخیرهی توکنها با تاریخ انقضا و مدیریت آنها
- Blacklist : برای باطل کردن توکنهای منقضی یا غیرفعال
- Refresh Token : برای تمدید توکنها بدون نیاز به لاگین مجدد
من در این پروژه از پکیج tymon/jwt-auth استفاده کردم که مراحل آن به شرح زیر است :
نصب کتبخانه JWT توسط کامپوزر با دستور زیر :
composer require tymon/jwt-auth
سپس با دستور زیر فایل پیکربندی JWT را در پروژه منتشر میکنیم :
فایل اصلی پیکربندی در مسیر config/jwt.php قرار میگیرد
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
سپس با دستور زیر یک کلید مخفی (Secret Key) که برای امضای توکنها استفاده میشود را ایجاد میکنیم :
این کلید باعث میشود که توکنهای JWT امن باشند و نتوان آنها را جعل کرد ، کلید مخفی در فایل .env ذخیره میشود
php artisan jwt:secret
مدل User باید از اینترفیس Tymon\JWTAuth\Contracts\JWTSubject استفاده کند. برای این کار، مدل User را بهروزرسانی میکنیم :
1: کلاس User ایمپلیمنت میکنه اینترفیس JWTSubject
2: با توجه به قانون شی گرایی کلاسهایی که اینترفیسی را پیادهسازی میکنند باید تمام متدهای آن را پیادهسازی کنند (اینترفیس JWTSubject دوتا متد دارد )
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
// ایمپلیمنت کردن مدل
{
// اضافه کردن متدها
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
}
سپس در کنترلر در متد create :
زمانی که کاربر اقدام به ثبت نام میکند توسط متد fromUser که از کلاس JWTAuth میباشد یک توکن برای کاربر ساخته میشود
پارامتر اول : $user کاربر مورد نظر است
پارامتر دوم : تاریخ الان + 1روز انقضا + تبدیل آن به تایم یونیکس (قابل فهم برای کامپیوتر)
$user = User::create($data);
if ($user) {
Auth::login($user);
$token = JWTAuth::fromUser($user, ['exp' => now()->addDays(1)->timestamp]);
Mail::to($data['email'])->send(new WelcomeMail(Auth::user(), $request->password));
} else {
return redirect()->back()->with('error', 'فرآیند ثبت نام با خطا مواجه شد ، لطفا مجدد اقدام بفرمایید');
}
return redirect()->route('front.index')->with('success', Auth::user()->name . "عزیز خوش آمدید $token");
}
و در متد لاگین :
زمانی که کاربر لاگین میکند ابتدا با متد JWTAuth::attempt ایمیل و رمز عبور کاربر رو با دیتابیس چک میشود اگر اطلاعات درست باشد یک توکن JWT با تاریخ انقضا جدید ایجاد میشود (البته بحث مدیریت توکنهای دارای اعتبار هم وجود دارد در اینجا )
if ($token = JWTAuth::attempt($credentials, ['exp' => now()->addDays(1)->timestamp])) {
$request->session()->regenerate();
} else {
return redirect()->back()->with('error', 'نام کاربری و یا رمزعبور اشتباه است');
}
این مطالب بر اساس جستجوهای من میباشد و صحت و استاندارد بودن آنها باید توسط منتورهای عزیز تأیید شود