احراز هویت با Laravel Passport

احراز هویت با Laravel Passport: راهنمای جامع

احراز هویت با Laravel Passport: راهنمای جامع

Laravel Passport یک پکیج قدرتمند برای Laravel است که به شما امکان می‌دهد به راحتی یک سیستم احراز هویت OAuth2 را برای برنامه‌های وب و موبایل خود پیاده‌سازی کنید. این سیستم به شما اجازه می‌دهد تا به کاربران خود اجازه دهید به برنامه‌های شخص ثالث دسترسی دهند، بدون اینکه نیاز به اشتراک‌گذاری مستقیم نام کاربری و رمز عبور خود داشته باشند. این مقاله به بررسی عمیق Laravel Passport، نحوه نصب، پیکربندی و استفاده از آن می‌پردازد.

مقدمه‌ای بر OAuth2 و Laravel Passport

OAuth2 یک استاندارد صنعتی برای احراز هویت و مجوز است. این استاندارد به کاربران اجازه می‌دهد تا به برنامه‌های شخص ثالث دسترسی محدودی به اطلاعات خود در یک سرویس دیگر (مانند Google، Facebook یا یک برنامه Laravel) بدهند. Laravel Passport یک پیاده‌سازی ساده و در عین حال قدرتمند از OAuth2 برای Laravel است. این پکیج از توکن‌های دسترسی (Access Tokens) برای احراز هویت درخواست‌ها استفاده می‌کند و به شما امکان می‌دهد تا مجوزهای دقیقی را برای هر توکن تعریف کنید.

نصب و پیکربندی Laravel Passport

برای شروع کار با Laravel Passport، ابتدا باید آن را نصب و پیکربندی کنید. مراحل زیر را دنبال کنید:

  1. نصب پکیج: از طریق Composer، پکیج Laravel Passport را نصب کنید:
    composer require laravel/passport
  2. انتشار فایل‌های پیکربندی: فایل‌های پیکربندی Passport را با استفاده از دستور Artisan منتشر کنید:
    php artisan vendor:publish --tag=passport-config
  3. اجرای Migrationها: Migrationهای لازم برای ایجاد جداول مربوط به Passport را اجرا کنید:
    php artisan migrate
  4. اضافه کردن Provider به فایل AuthServiceProvider: در فایل app/Providers/AuthServiceProvider.php، متد boot را به صورت زیر تغییر دهید:
            public function boot()
            {
                Passport::routes();
            }
            
  5. مدل User را پیکربندی کنید: اطمینان حاصل کنید که مدل User شما از trait HasApiTokens استفاده می‌کند. این trait توکن‌های API را برای کاربران شما مدیریت می‌کند.
            use LaravelPassportHasApiTokens;
            use IlluminateFoundationAuthUser as Authenticatable;
    
            class User extends Authenticatable
            {
                use HasApiTokens, HasFactory, Notifiable;
            }
            

ایجاد Client

قبل از اینکه بتوانید از Passport استفاده کنید، باید یک Client ایجاد کنید. Clientها نشان‌دهنده برنامه‌هایی هستند که می‌خواهند به API شما دسترسی پیدا کنند. می‌توانید Clientها را از طریق Tinker یا از طریق یک Seed ایجاد کنید. در اینجا یک مثال از ایجاد Client از طریق Tinker آورده شده است:

php artisan tinker
> use LaravelPassportClient;
> $client = new Client();
> $client->user_id = 1; // ID کاربر مالک Client
> $client->name = 'Mobile App';
> $client->redirect_logins_enabled = true;
> $client->password_client = false;
> $client->save();
> $client->secret; // Secret Client را ذخیره کنید

مقدار client_id و client_secret را برای استفاده در مراحل بعدی ذخیره کنید.

دریافت توکن دسترسی (Access Token)

برای دریافت توکن دسترسی، باید یک درخواست POST به endpoint /oauth/token ارسال کنید. این درخواست باید شامل پارامترهای زیر باشد:

  • grant_type: نوع اعطای مجوز (معمولاً password برای احراز هویت با نام کاربری و رمز عبور).
  • client_id: ID Client.
  • client_secret: Secret Client.
  • username: نام کاربری.
  • password: رمز عبور.
  • scope: مجوزهای مورد نیاز (به عنوان مثال، read، write).

می‌توانید از ابزارهایی مانند Postman یا cURL برای ارسال این درخواست استفاده کنید. یک مثال از درخواست cURL:

curl -X POST -H "Content-Type: application/json" -d '{"grant_type":"password","client_id":"YOUR_CLIENT_ID","client_secret":"YOUR_CLIENT_SECRET","username":"YOUR_USERNAME","password":"YOUR_PASSWORD","scope":"read write"}' http://your-app.test/oauth/token

در صورت موفقیت، پاسخ شامل یک توکن دسترسی (access_token) و یک توکن تازه‌سازی (refresh_token) خواهد بود.

استفاده از توکن دسترسی

برای دسترسی به API خود، باید توکن دسترسی را در هدر Authorization درخواست‌های خود ارسال کنید. هدر باید به صورت زیر باشد:

Authorization: Bearer YOUR_ACCESS_TOKEN

Laravel Passport به طور خودکار توکن را تأیید می‌کند و در صورت معتبر بودن، درخواست را پردازش می‌کند. می‌توانید از middleware auth:api برای محافظت از endpointهای API خود استفاده کنید.

تازه‌سازی توکن دسترسی (Refresh Token)

توکن‌های دسترسی معمولاً عمر محدودی دارند. برای جلوگیری از نیاز به احراز هویت مجدد کاربران، می‌توانید از توکن تازه‌سازی استفاده کنید. برای تازه‌سازی توکن دسترسی، یک درخواست POST به endpoint /oauth/refresh ارسال کنید. این درخواست باید شامل پارامترهای زیر باشد:

  • grant_type: باید refresh_token باشد.
  • refresh_token: توکن تازه‌سازی.
  • client_id: ID Client.
  • client_secret: Secret Client.
  • scope: مجوزهای مورد نیاز.

در صورت موفقیت، پاسخ شامل یک توکن دسترسی جدید و یک توکن تازه‌سازی جدید خواهد بود.

مجوزها (Scopes)

مجوزها به شما امکان می‌دهند تا دسترسی به API خود را به صورت دقیق کنترل کنید. می‌توانید مجوزها را در هنگام ایجاد Client تعریف کنید و در هنگام درخواست توکن دسترسی، مجوزهای مورد نیاز را مشخص کنید. برای تعریف مجوزها، می‌توانید از کلاس Passport::scopes() در فایل config/passport.php استفاده کنید.

محافظت از Endpointهای API

برای محافظت از endpointهای API خود، می‌توانید از middleware auth:api استفاده کنید. این middleware به طور خودکار توکن دسترسی را تأیید می‌کند و در صورت معتبر بودن، درخواست را پردازش می‌کند. برای استفاده از این middleware، آن را به route مورد نظر اضافه کنید:

Route::get('/api/users', 'UserController@index')->middleware('auth:api');

نکات امنیتی

  • همیشه از HTTPS برای تمام ارتباطات خود استفاده کنید.
  • Secret Client را به صورت امن ذخیره کنید و آن را در معرض دید قرار ندهید.
  • از مجوزهای دقیق برای کنترل دسترسی به API خود استفاده کنید.
  • توکن‌های دسترسی را به طور منظم تازه‌سازی کنید.
  • از توکن‌های تازه‌سازی با دقت استفاده کنید و عمر آنها را محدود کنید.

جمع‌بندی

Laravel Passport یک ابزار قدرتمند و انعطاف‌پذیر برای پیاده‌سازی سیستم احراز هویت OAuth2 در برنامه‌های Laravel شما است. با استفاده از این پکیج، می‌توانید به راحتی یک سیستم احراز هویت امن و مقیاس‌پذیر ایجاد کنید که به کاربران شما اجازه می‌دهد تا به برنامه‌های شخص ثالث دسترسی دهند، بدون اینکه نیاز به اشتراک‌گذاری مستقیم نام کاربری و رمز عبور خود داشته باشند. با دنبال کردن مراحل و نکات ارائه شده در این مقاله، می‌توانید به طور موثر از Laravel Passport در پروژه‌های خود استفاده کنید.