Laravel 8 Sanctum을 사용한 REST API 인증

Sanctum은 단일 페이지 애플리케이션(SPA), 모바일 애플리케이션 및 기본 토큰 기반 API의 인증을 위한 Laravel 패키지입니다.

SPA 인증을 위해 Sanctum은 Laravel의 내장 쿠키 기반 인증 서비스를 사용합니다. 반응과 같은 프런트 엔드 기술로 작업하는 동안 Angular Sanctum은 쿠키를 생성하고 이를 사용하여 브라우저에 저장하여 인증을 수행합니다. 토큰 기반 Rest API의 경우 Sanctum은 토큰을 생성하고 personal_access_tokens 테이블에 저장합니다. 인증이 이 테이블과 일치하는 동안 토큰을 찾을 수 없으면 인증이 실패합니다.

먼저 sanctum 패키지를 설치한 다음 등록, 로그인, 로그아웃 API를 생성하고 경로를 보호합시다.

설치:




composer require laravel/sanctum


이 명령은 작곡가를 사용하여 패키지를 설치합니다.

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"


다음으로 이 명령을 실행하면 personal_access_token 테이블에 대한 마이그레이션 파일과 sanctum에 대한 구성 파일이 생성됩니다. 2019_12_14_000001_create_personal_access_tokens_table.php와 같은 데이터베이스->마이그레이션 폴더에서 이 파일을 확인할 수 있습니다.

php artisan migrate


그런 다음 이 명령을 실행하면 Sanctum이 API 토큰을 저장하는 데이터베이스에 personal_access_token 테이블이 생성됩니다.

구성:



app->Http->Kernal.php로 이동하여 middlewareGroups의 apis 배열에 주어진 라인을 추가합니다.

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],



참고: API를 여러 번 호출하는 동안 시도 횟수가 너무 많으면 오류가 발생합니다. 그런 다음 'throttle:api' 줄에 주석을 달고 아래 스크린샷과 같이 기본값을 유지합니다.


다음으로 UserModel.php 파일로 이동하여 usermodel이 HasApiTokens를 사용하여 토큰을 발급할 수 있도록 코드 아래에 set을 추가합니다.

use Laravel\Sanctum\HasApiTokens;
use HasApiTokens, HasFactory, Notifiable;


내 프로젝트의 hasFactory 특성이 자동 로드되지 않았습니다.

컨트롤러 만들기


php artisan make:controller Api\AuthController
이 명령은 컨트롤러 폴더의 Api 폴더에 authController를 생성합니다.

route->api.php 파일에 경로 설정

use App\Http\Controllers\Api\AuthController;
Route::post("/register",[AuthController::class,'register']);
Route::post("/login",[AuthController::class,'login']);


authController에서 등록 기능을 만들어 봅시다. 이 새로운 사용자 및 토큰에서 응답을 생성하고 제공합니다.

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

        $user = User::create([
            'name'=>$fields['name'],
            'email'=>$fields['email'],
            'password'=>Hash::make($fields['password']),
        ]);

        //create token
        $token = $user->createToken('myapptoken')->plainTextToken;

        $response = [
            'status'=>true,
            'message'=>'registered successfully!',
            'data' =>[
                'user'=>$user,
                'token'=>$token
            ]
        ];
        return response($response,201);
    }


그리고 아래와 같이 postman을 사용하여 api를 호출합니다.

로그인 기능:



public function login(Request $request){
        $fields = $request->validate([
            'email'=>'required|string|email',
            'password' =>'required|confirmed'
        ]);
        //check email
        $user = User::where('email',$fields['email'])->first();
        //check password
        if(!$user || !Hash::check($fields['password'],$user->password)){
            return response(['status'=>false,'message'=>'invalid email or password'],401);
        }

        //create token
        $token = $user->createToken('myapptoken')->plainTextToken;

        $response = [
            'status'=>true,
            'message'=>'Login successful!',
            'data' =>[
                'user'=>$user,
                'token'=>$token
            ]
        ];
        return response($response,201);
    }

아래와 같이 로그인 API를 호출합니다.


이제 아래와 같이 api-routes 파일에 인증 경로를 생성해 보겠습니다.

Route::group(['middleware'=>['auth:sanctum']],function(){
    Route::post("/logout",[AuthController::class,'logout']);
});


위 경로에서 sanctum 미들웨어는 Authorization 헤더에서 토큰의 유효성을 검사합니다.

authController에서 함수 로그아웃을 만들어 봅시다.

public function logout(Request $request){
        auth()->user()->tokens()->delete();
        $response = [
            'status'=>true,
            'message'=>'Logout successfully',
        ];
        return response($response,201);
    }





토큰이 설정/검증되지 않는 동안 아래 응답을 받습니다.
{
"message": "Unauthenticated."
}

참고: 헤더 Accept:application/json을 설정하여 위 API에 대한 json 응답을 받고 Bearer가 있는 Authorization 헤더를 설정합니다.

좋은 웹페이지 즐겨찾기