برای همه ما پیش آمده که توی پروژه های تحت وبی که داریم نیاز شده یکسری api
هم ارئه بدیم. توی این مقاله میخوام ساده ترین راه authenticate
کاربران توی لاراول رو بهتون نشون بدم، با من همراه باشید.
قبل از هر کاری باید یه پروژه لاراول داشته باشیم یا یکی جدید شروع کنیم! من با دستور زیر یه پروژه جدید میسازم.
composer create-project laravel/laravel api
تنها پیشنیازی که وجود داره Auth لاراول هست که با دستور زیر اون رو هم نصب میکنم!!
composer require laravel/ui
بعد از نصب لاراول و احراز هویت اون وقت تنظیم کردن دیتابیس، مایگریشن ها و بقیه چیز هاست... توی فایل .env
تنظیمات مربوط به دیتا بیس رو تنظیم میکنیم.
DB_DATABASE=laravel #اسم دیتابیس DB_USERNAME=root # نام کاربری DB_PASSWORD= # پسورد
بعد از اون باید یک تغییر کوچولو توی مایگریش مربوط به user
باید داشته باشیم
$table->string("api_token")->nullable()->unique();
و این فیلد جدید رو توی مدل user
باید fillable
کنیم که بتونیم بعدا بهش چیزی اضافه کنیم!
protected $fillable = [ 'name', 'email', 'password', "api_token", ];
حالا توی فایل config/auth.php
باید یک guard
جدید تعریف کنیم!
'guards' => [ . . ., "api"=>[ "driver"=>"token", "provider"=>"users", ] ],
اگر میخواید از فیلد خاصی برای احرازهویت استفاده کنید باید در آرایه بالا storage_key
رو برابر با فیلد موردنظر خودتون قرار بدید.
برای استفاده از توکن توی route
هایی که نیاز دارید باید از middleware auth:api
استفاده کنید.
Route::get("user/all",function (){ return \App\User::all(); })->middleware("auth:api");
برای ایجاد توکن به یک route
و controller
نیاز داریم توی ترمینال دستور زیر رو وارد میکنیم php artisan make:controller Api/AuthenticateController
برای ساخت route
هم توی فایل routes/api.php
به صورت زیر اقدام با ساخت route های احراز هویت میکنیم!
Route::post("login",[\App\Http\Controllers\Api\AuthenticateController::class,"login"]); Route::post("register",[\App\Http\Controllers\Api\AuthenticateController::class,"register"]);
حالا باید کد های کنترلر رو بنویسیم
public function login(Request $request): \Illuminate\Http\JsonResponse { $valid = $request->validate([ "email" => ["required", "email"], "password" => ["required"] ]); if (!auth()->attempt($valid)) return response()->json([ "message" => "Invalid credentials" ], ۴۰۱); $user =auth()->user(); $user->update([ "api_token" => \Illuminate\Support\Str::random(۶۰) ]); return response()->json([ "message" => "Successfully logged in", "user" => $user ]); } public function register(Request $request): \Illuminate\Http\JsonResponse { $valid= $request->validate([ "name" => ["required"], "email" => ["required", "email","unique:users"], "password" => ["required"] ]); $valid['api_token'] = \Illuminate\Support\Str::random(۶۰); $valid['password'] = bcrypt($valid['password']); $user = \App\Models\User::create($valid); return response()->json([ "message" => "Successfully registered", "user" => $user ]); }
چون فیلدی که توی دیتابیس ذخیره کردیم محدودیت ۲۵۵ کارکتری داره مجاز هستم هرجوری که دوست داریم توکن رو بسازیم! خب دیگه تموم هست فقط میمونه ارسال توکن به پروژه و احرازهویت توکن و کاربر، برای این کار همیادتون نره که پسور رو hash
کنید
خب بعد از این همه دردسر وقت اون میرسه که توکن رو ارسال کنیم، برای اینکار چندتا راه وجود داره
میتونید token
ساخته شده رو به صورت زیر به سایت خودتون ارسال کنید.
$response = $client->request('GET', '/api/user?api_token='.$token);
$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', ], 'form_params' => [ 'api_token' => $token, ], ]);
$response = $client->request('POST', '/api/user', [ 'headers' => [ 'Authorization' => 'Bearer '.$token, 'Accept' => 'application/json', ], ]);
امیدوارم مقاله آموزندهای بوده باشه.