
خب، بریم یکم خودمونیتر و تخصصیتر در مورد Laravel Passport صحبت کنیم. این پکیج یه چیز خفن و رسمی از طرف تیم لاراوله که کل ماجرای احراز هویت API رو برایت خیلی ساده و مرتب میکنه. توی سیستمهایی که میخوای کاربرها یا سرویسهای مختلف به API تو دسترسی داشته باشن، Passport میتونه نجاتدهنده باشه. حالا بیا از پایه شروع کنیم.
فرض کن یه اپلیکیشن داری (مثل یه اپ موبایل یا یه SPA) که از یه API بکاند استفاده میکنه. تو اینجا نیاز داری که بهشکلی امن بدونی:
پروتکل OAuth2 دقیقاً همین کار رو میکنه، ولی خیلی دردسر داره. مثلاً باید دستی توکن بسازی، توکنها رو مدیریت کنی، رمزنگاری کنی، و کلی کار دیگه. لاراول پاسپورت اومده تا این دردسرها رو کلاً برات جمع کنه و با چندتا دستور ساده همه چیزو راه بندازه.
خب، مثل هر پکیج دیگهای، اول باید نصبش کنیم:
composer require laravel/passportحالا باید migrationها رو اجرا کنیم که دیتابیس آماده بشه برای ذخیره توکنها و بقیه داستانها:
php artisan migrateبعد از این، میایم کلیدهای رمزنگاری برای امضای توکنها رو ایجاد میکنیم:
php artisan passport:installاین دستور دو تا چیز مهم میسازه:
• کلیدهای خصوصی و عمومی برای امضای توکنها.
• اطلاعات اولیه برای کلاینتها (اگه بخوای کلاینتها به API وصل بشن).
برای اینکه پاسپورت کار کنه، باید توی فایل AuthServiceProvider اینو اضافه کنیم:use Laravel\Passport\Passport;public function boot(){ $this->registerPolicies(); Passport::routes(); // این خط میاد همه روتهای مربوط به OAuth2 رو ثبت میکنه.}۳. تنظیم مدل User
حالا توی مدل User، Trait مخصوص پاسپورت رو اضافه میکنیم:
use Laravel\Passport\HasApiTokens;class User extends Authenticatable{ use HasApiTokens, Notifiable;}۴. تغییر Guard برای API
باید بگیم وقتی کسی درخواست API میفرسته، از Passport برای احراز هویت استفاده کنه. این تنظیم رو توی فایل config/auth.php انجام میدیم:
'api' => [ 'driver' => 'passport', 'provider' => 'users',],ایجاد توکن برای کاربر
فرض کن یه کاربر تازه ثبتنام کرده یا لاگین کرده. ما میتونیم یه توکن دسترسی براش بسازیم:
$user = User::find(1); // یا هر کاربر دیگهای که داری$token = $user->createToken('TokenName')->accessToken;return response()->json(['token' => $token]);حالا وقتی این توکن بهدست میاد، باید با هر درخواست API بهصورت Bearer Token توی هدر فرستاده بشه:
GET /api/user HTTP/1.1Host: example.comAuthorization: Bearer eyJ0eXAiOiJKV1QiLCJh...برای اینکه فقط کاربران احراز هویتشده به یه روت دسترسی داشته باشن، از middleware auth:api استفاده میکنیم:
Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user();});انواع توکنها در Passport
1. Personal Access Tokens
اینها برای استفاده مستقیم توسط کاربران ساخته میشن. مثلاً کاربر لاگین میکنه و یه توکن میگیره.
2. Password Grant Tokens
برای زمانی که کاربر قراره از طریق نام کاربری و رمز عبورش لاگین کنه. این مورد بیشتر توی اپلیکیشنهای موبایل استفاده میشه.
3. Client Credentials
اینو وقتی استفاده میکنی که یه سرویس بخواد بدون اینکه کاربری در کار باشه، مستقیم به API وصل بشه. مثل سرویسهای داخلی.
فرض کن قراره API لاگین و ثبتنام با Passport بسازیم.
ثبتنام کاربر:
use Illuminate\Http\Request;use App\Models\User;use Illuminate\Support\Facades\Hash;Route::post('/register', function (Request $request) { $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); $token = $user->createToken('MyApp')->accessToken; return response()->json(['token' => $token], 201);});لاگین کاربر:
use Illuminate\Support\Facades\Auth;Route::post('/login', function (Request $request) { if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) { $user = Auth::user(); $token = $user->createToken('MyApp')->accessToken; return response()->json(['token' => $token], 200); } else { return response()->json(['error' => 'Unauthorized'], 401); }});گرفتن اطلاعات کاربر لاگینشده:
Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user();});اگه بخوای توکنها بعد از یه مدت خاص منقضی بشن، اینو توی AuthServiceProvider مشخص کن:
use Carbon\Carbon;Passport::tokensExpireIn(Carbon::now()->addDays(15));Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));Passport::personalAccessTokensExpireIn(Carbon::now()->addMonths(6));حذف همه توکنهای قبلی کاربر:
$user->tokens()->delete();اضافه کردن Scope به توکنها:
Scopeها دسترسیهای خاص رو مشخص میکنن. مثلاً میتونی بگی این توکن فقط اجازه خوندن اطلاعات رو داره:
Passport::tokensCan([ 'view-profile' => 'View user profile', 'edit-profile' => 'Edit user profile',]);$token = $user->createToken('MyApp', ['view-profile'])->accessToken;حالا توی Middleware میتونی چک کنی:
Route::middleware('scopes:view-profile')->get('/profile', function () { // کاربر اجازه دیدن پروفایل داره});جمعبندی
Laravel Passport زندگی رو برای مدیریت احراز هویت و دسترسی در APIها خیلی راحتتر میکنه. دیگه لازم نیست خودت دستی توکن بسازی و از پروتکل OAuth2 سردربیاوری. با چندتا دستور ساده میتونی سیستمی امن و مقیاسپذیر راه بندازی. اگه باز هم جایی گیر کردی، بگو تا بیشتر راهنمایی کنم. 😎