تاریخ امروز:29 فروردین 1403
احراز هویت با api در لاراول 10 با استفاده از passport

احراز هویت با API در لاراول 10 با استفاده از Passport

API مخفف رابط برنامه‌نویسی کاربردی است. یه جور واسطه بین برنامه‌های کامپیوتری مختلفه که بهشون کمک می‌کنه با هم ارتباط برقرار کنن. این برنامه‌ها از طریق درخواست و پاسخ با هم تبادل اطلاعات می‌کنن. در این مقاله میخوایم احراز هویت با API رو توی لاراول توسط پکیج پاسپورت بررسی کنیم و چندتا مثال ساده بزنیم ازش. ولی اول اجازه بدین در مورد خود API صحبت کنیم و یک مثال بزنیم براش:
مثال:
فرض کنید می‌خواید توی یه سایتی ثبت نام کنید. ممکنه سایت به شما این امکان رو بده که با استفاده از حساب گوگل خودتون ثبت نام کنید. در این حالت، فقط کافیه آدرس جیمیل خودتون رو وارد کنید و بعد از تأیید، به طور خودکار به سایت مورد نظر هدایت می‌شید.

اینجا یه API داره پشت پرده کار می‌کنه که شما رو با کمترین تعداد مراحل، احراز هویت می‌کنه.

برخی کابردهای API

اتصال برنامه‌های مختلف به هم: مثلاً یه برنامه تقویم می‌تونه با استفاده از API به اطلاعات جیمیل شما دسترسی پیدا کنه و رویدادها رو به طور خودکار به تقویم شما اضافه کنه.
به اشتراک گذاشتن اطلاعات: یه شرکت می‌تونه با استفاده از API، اطلاعات محصولاتش رو با یه وب‌سایت فروش آنلاین به اشتراک بذاره.
اتوماسیون وظایف: یه برنامه می‌تونه با استفاده از API، یه سری وظایف رو به طور خودکار انجام بده، مثلاً ارسال ایمیل یا پست توی شبکه‌های اجتماعی.

برخی مزایای استفاده از API

صرفه‌جویی در زمان و هزینه: با استفاده از API، می‌تونید وظایف رو به طور خودکار انجام بدید و از دوباره کاری و هدر رفتن زمان و هزینه جلوگیری کنید.
افزایش کارایی: با استفاده از API، می‌تونید برنامه‌های مختلف رو به هم متصل کنید و یه سیستم یکپارچه و کارآمد ایجاد کنید.
دسترسی به اطلاعات: با استفاده از API، می‌تونید به اطلاعات مختلفی که در برنامه‌های دیگه وجود داره، دسترسی پیدا کنید.

فرض کنید می‌خواهید از سرزمین A به سرزمین B برید، اما در بین راه یک رودخانه‌ی خروشان وجود داره. بدون پل، عبور از رودخانه غیرممکنه.

احراز هویت با api

احراز هویت با api

به همین ترتیب، برنامه‌های کامپیوتری هم برای برقراری ارتباط با هم به یه واسطه نیاز دارن. API مثل همون پل عمل می‌کنه و به برنامه‌ها اجازه می‌ده اطلاعات رو رد و بدل کنن، حتی اگر از زبان‌های برنامه‌نویسی مختلفی استفاده کنن.

احراز هویت چی هست؟

احراز هویت مثل تأیید هویت می‌مونه. قبل از اینکه اجازه ورود به یه مکان یا استفاده از یه وسیله‌ای رو داشته باشیم، باید هویتمون تأیید بشه.

تو دنیای کامپیوتر هم همینطوره. قبل از اینکه یه برنامه بتونه به اطلاعات یا خدمات یه سیستم دیگه دسترسی پیدا کنه، باید هویتش تأیید بشه.

لاراول یه فریم‌ورک محبوب برای برنامه‌نویسی وب هست که امکان احراز هویت کاربران رو به دو صورت وب و API فراهم می‌کنه.

احراز هویت API به برنامه‌ها اجازه می‌ده که به طور امن به اطلاعات و خدمات یه سیستم دیگه دسترسی پیدا کنن.

پکیج Passport یه ابزار قدرتمند برای پیاده‌سازی احراز هویت API تو لاراول هست. این پکیج از OAuth2 استفاده می‌کنه که یه استاندارد امن برای احراز هویت API هست.

Passport توکن‌هایی رو تولید می‌کنه که برنامه‌ها برای احراز هویت خودشون ازشون استفاده می‌کنن.

مزایای استفاده از Passport برای احراز هویت با API

امنیت: Passport از یه پروتکل امن برای احراز هویت استفاده می‌کنه.
قابلیت انعطاف‌پذیری: Passport می‌تونه با انواع مختلف برنامه‌ها و سیستم‌ها استفاده بشه.
سادگی: استفاده از Passport خیلی راحته.

اگه می‌خواید امنیت برنامه خودتون رو افزایش بدید، از Passport برای پیاده‌سازی احراز هویت با API استفاده کنید.

خب بریم برای آموزش استفاده از پاسپورت برای احراز هویت با API.

ابتدا لازم هستش که کارای اولیه رو انجام بدیم و خود لاراول رو نصب کنیم. من عادت دارم همیشه با کامپوزر نصبش میکنم. به هر حال برای روش نصبش میتونید به خود داکیومنت رسمی لاراول مراجعه کنید:

composer create-project laravel/laravel soroushapi

بعد نصب توی ادیتور محبوبتون بازش کنید پروژه رو (من خودم phpstorm رو ترجیح میدم) و یه Seeder برای یوزرها بسازید:

php artisan make:seeder UserSeeder

حالا مسیر database/seeders/ رو باز کنید و فایلش رو باز کنید.

و کدش رو من اینجوری نوشتم:

User::create([
   'name' => Str::random(10),
    'email' => Str::random(10).'@example.com',
    'password' => Hash::make('123456789'),
]);

خب این کلاس UserSeeder رو میزاریمش توی کلاس DatabaseSeeder و متد run:

$this->call([
    UserSeeder::class,
]);

خب این‌ها رو که نوشتیم میریم .env رو ویرایش میکنیم و اطلاعات دیتابیس رو میزاریم توش و دستور migrate رو اجرا می‌کنیم:

php artisan migrate

و بعدش:

php artisan db:seed

خب حالا میریم سراغ نصب پکیج پاسپورتمون برای احراز هویت با API:

composer require laravel/passport

بعد از اینکه نصبش تموم شد migrate رو یکبار دیگه اجرا میکنیم تا جدول‌هاش رو درست کنه سیستم.

بعد از ساخت جداول دستور زیر رو اجرا می‌کنیم:

php artisan passport::install

بعد از نصب به مدل User میریم و به این صورت تغییر میدیمش:

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
........
}

حواسمون باید باشه که Laravel\Sanctum\HasApiTokens رو حتما حذف کنیم و اون پکیج پاسپورت رو صدا بزنیم.

حالا به config/auth.php میریم و بخش guards رو به این صورت تغییر میدیم:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],


    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ]
],

خب حالا میرسیم به ساخت Controller برای انجام کارمون:

php artisan make:controller Api/AuthenticationController

و route های مربوطه رو وارد میکنیم توی فایل routes/api.php:

Route::group(['namespace' => 'Api', 'prefix' => 'v1'], function () {
  Route::post('login', [AuthenticationController::class, 'store']);
});

حالا داخل کنترلر متد store رو می‌نویسیم:

public function store()
{
    if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
        // successfull authentication
        $user = User::find(Auth::user()->id);

        $user_token['token'] = $user->createToken('appToken')->accessToken;

        return response()->json([
            'success' => true,
            'token' => $user_token,
            'user' => $user,
        ], 200);
    } else {
        // failure to authenticate
        return response()->json([
            'success' => false,
            'message' => 'Failed to authenticate.',
        ], 401);
    }
}

ازین متد برای لاگ اوت می‌تونیم استفاده کنیم:

/**
* Destroy an authenticated session.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\RedirectResponse
*/
 public function destroy(Request $request)
 {
     if (Auth::user()) {
         $request->user()->token()->revoke();

         return response()->json([
             'success' => true,
             'message' => 'Logged out successfully',
         ], 200);
     }
 }

فقط باید حواسمون باشه که به route هامون اضافه کرده باشیمش:

Route::post('logout', [AuthenticationController::class, 'destroy'])->middleware('auth:api');

آدرس endpoint لاگین ما میشه:

http://127.0.0.1:8000/api/v1/login

و حالا میتونیم با postman تستش کنیم.

آدرس endpoint خروج ما هم میشه:

http://127.0.0.1:8000/api/v1/logout

فقط باید حواسمون باشه، token که از لاگین گرفتیم رو پاس بدیم به logout به کلمه کلیدی: Bearer یعنی اگر توکن ما این باشد:

RnkbmL1ZoFX9I6sMuONIpe03hDJu7nOFtweijiRk

باید توی Authorization مقدار زیر پاس داده شود:

Bearer RnkbmL1ZoFX9I6sMuONIpe03hDJu7nOFtweijiRk

 

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *