ویرگول
ورودثبت نام
Sedali
Sedaliیه پسری که کل عمرش دنبال این بود که یه Div رو center کنه:)
Sedali
Sedali
خواندن ۳ دقیقه·۶ ماه پیش

لاراول پاسپورت (Laravel Passport)

خب، بریم یکم خودمونی‌تر و تخصصی‌تر در مورد Laravel Passport صحبت کنیم. این پکیج یه چیز خفن و رسمی از طرف تیم لاراوله که کل ماجرای احراز هویت API رو برایت خیلی ساده و مرتب می‌کنه. توی سیستم‌هایی که می‌خوای کاربرها یا سرویس‌های مختلف به API تو دسترسی داشته باشن، Passport می‌تونه نجات‌دهنده باشه. حالا بیا از پایه شروع کنیم.

ایده اصلی Passport چیه؟

فرض کن یه اپلیکیشن داری (مثل یه اپ موبایل یا یه SPA) که از یه API بک‌اند استفاده می‌کنه. تو اینجا نیاز داری که به‌شکلی امن بدونی:

1. کی داره درخواست می‌فرسته؟ (یعنی احراز هویت)

2. این شخص به چی دسترسی داره؟ (یعنی مجوز دادن یا Authorization)

پروتکل OAuth2 دقیقاً همین کار رو می‌کنه، ولی خیلی دردسر داره. مثلاً باید دستی توکن بسازی، توکن‌ها رو مدیریت کنی، رمزنگاری کنی، و کلی کار دیگه. لاراول پاسپورت اومده تا این دردسرها رو کلاً برات جمع کنه و با چندتا دستور ساده همه چیزو راه بندازه.

چطوری Laravel Passport رو راه بندازیم؟

1. نصب و تنظیمات اولیه

خب، مثل هر پکیج دیگه‌ای، اول باید نصبش کنیم:

composer require laravel/passport

حالا باید migrationها رو اجرا کنیم که دیتابیس آماده بشه برای ذخیره توکن‌ها و بقیه داستان‌ها:

php artisan migrate

بعد از این، میایم کلیدهای رمزنگاری برای امضای توکن‌ها رو ایجاد می‌کنیم:

php artisan passport:install

این دستور دو تا چیز مهم می‌سازه:

• کلیدهای خصوصی و عمومی برای امضای توکن‌ها.

• اطلاعات اولیه برای کلاینت‌ها (اگه بخوای کلاینت‌ها به API وصل بشن).

2. اضافه کردن Passport به پروژه

برای اینکه پاسپورت کار کنه، باید توی فایل 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.1
Host: example.com
Authorization: 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 سردربیاوری. با چندتا دستور ساده می‌تونی سیستمی امن و مقیاس‌پذیر راه بندازی. اگه باز هم جایی گیر کردی، بگو تا بیشتر راهنمایی کنم. 😎

احراز هویتلاراول
۰
۰
Sedali
Sedali
یه پسری که کل عمرش دنبال این بود که یه Div رو center کنه:)
شاید از این پست‌ها خوشتان بیاید