احمد نادری

توسعه دهنده فول استک

author
author

احمد نادری

توسعه دهنده فول استک

پکیج احراز هویت مناسب برای لاراول

یکی از مسائل مهمی که باید به اون توجه داشت سیستم احراز هویت در پروژه های لاراولی هست . این موضوع به نوع پروژه بستگی داره که Sanctum یا Passport یا jwt رو انتخاب کنیم ….

خب تفاوت sanctum با passport استفاده پاسپورت از سیستم oauth هست . خب چیه اینه ؟برای مثال با این مکانیزم و با استفاده از حساب های کاربری Google, Facebook, Twitch, Microsoft یا دیگر Third-Partyهای معتبر میتونیم تو توسایت ثبت نام و لاگین کنیم.

به صورت خلاصه و به نظرمن :

اگر به oauth احتیاج ندارید برید سراغ Sanctum with SPA Authentication(or API Tokens) + Mobile Application Authentication هم برای موبایل هم برای spa ها کافیه.

 برای نصب sanctum :

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
#######################
#######################
#######################
Add to User Model :
use Laravel\Sanctum\HasApiTokens;
....
class User extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;

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

App\Traits\ApiResponser.php
#############################
<?php

namespace App\Traits;

use Carbon\Carbon;

/*
|--------------------------------------------------------------------------
| Api Responser Trait
|--------------------------------------------------------------------------
|
| This trait will be used for any response we sent to clients.
|
*/

trait ApiResponser
{
	/**
     * Return a success JSON response.
     *
     * @param  array|string  $data
     * @param  string  $message
     * @param  int|null  $code
     * @return \Illuminate\Http\JsonResponse
     */
	protected function success($data, string $message = null, int $code = 200)
	{
		return response()->json([
			'status' => 'Success',
			'message' => $message,
			'data' => $data
		], $code);
	}

	/**
     * Return an error JSON response.
     *
     * @param  string  $message
     * @param  int  $code
     * @param  array|string|null  $data
     * @return \Illuminate\Http\JsonResponse
     */
	protected function error(string $message = null, int $code, $data = null)
	{
		return response()->json([
			'status' => 'Error',
			'message' => $message,
			'data' => $data
		], $code);
	}

و حالا مثالی ازعضویت و لاگین :

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Traits\ApiResponser;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    use ApiResponser;

    public function register(Request $request)
    {
        $attr = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|unique:users,email',
            'password' => 'required|string|min:6|confirmed'
        ]);

        $user = User::create([
            'name' => $attr['name'],
            'password' => bcrypt($attr['password']),
            'email' => $attr['email']
        ]);

        return $this->success([
            'token' => $user->createToken('API Token')->plainTextToken
        ]);
    }

    public function login(Request $request)
    {
        $attr = $request->validate([
            'email' => 'required|string|email|',
            'password' => 'required|string|min:6'
        ]);

        if (!Auth::attempt($attr)) {
            return $this->error('Credentials not match', 401);
        }

        return $this->success([
            'token' => auth()->user()->createToken('API Token')->plainTextToken
        ]);
    }

    public function logout()
    {
        auth()->user()->tokens()->delete();

        return [
            'message' => 'Tokens Revoked'
        ];
    }
}

درباره من
  • سلام به وب سایت من خوش اومدید ! از سال 1388 که وارد دنیای برنامه نویسی شدم تجربیات خودم رو از پروژه های مختلف به دست آوردم و همیشه سعی کردم تا مهارت های فنی و رفتاری خودم رو ارتقا بدم تا بتونم برای خودم و سازمانی که در آن کار می کنم بهترین باشم . من عاشق یادگیری هستم و همیشه از چالش های جدید هیجان زده میشم چون اونارو کلید موفقیت و رشد خودم می دونم.
  • @ahmadnaderi01
arrow