Laravel JWT - 2. 로그인하기 > IT 기술백서

IT 기술백서

직접 알아내거나 검색하기 귀찮아서 모아 둔 것

php | Laravel JWT - 2. 로그인하기

본문

과정요약

  1. User 모델에 JWTSubject 인터페이스를 구현한다.
  2. config/auth.php 에 api 인증방법을 jwt 로 수정한다.
  3. Controller 에 login() 메서드를 구현한다. 
  4. 라우트에 login 추가

 

1. User 모델에 Tymon\JWTAuth\Contracts\JWTSubject 인터페이스 포함하고 메서드를 구현한다.

[code]

class User extends Authenticatable implements JWTSubject

{

    .... 

    public function getJWTIdentifier()

    {

        return $this->getKey();

    }

 

    public function getJWTCustomClaims()

    {

        return [

            'name' => $this->name,

            'email' => $this->email,

        ];

    }

}

[/code]

 

getJWTIdentifier()

JWT 토큰($this->getKey())을 리턴한다.

 

getJWTCustomClaims()
JWT 구조는 "헤더(header).내용(payload).서명(signature)" 으로 되어 있다.

내용(payload) 에는 기본적으로 아래와 같은 정보(Claim) 을 가지고 있다.

iss (Issuer): 토큰 발급자

sub (subject): 토큰 제목 - 기본값은 user id

iat (Issued At): 토큰 발행날짜 - timestamp

exp (Expiry): 토큰 만료날짜

nbf (Not before): 토큰이 유효한 시작 시간

jti (JWT ID): 중복을 막기위한 JWT 고유 식별자

prv (Provider): 사용자 공급 클래스의 해쉬값.

 

이 외에 사용자가 임의로 토큰에 정보를 추가하고 싶을 때 getJWTCustomClaims() 메서드에 key, value 로 입력하면 된다.

 

2. config/auth.php 에서 guards.api.driver 를 jwt 로 수정해준다.

[code]

...

'guards' => [

    'web' => [

        'driver' => 'session',

        'provider' => 'users',

    ],

    'api' => [

        'driver' => 'jwt',

        'provider' => 'users',

    ],

],

...

[/code]

 

3. app\Http\Controllers\JWTAuthController.php 에 login 메서드를 추가해준다.

[code]

 

<?php

namespace App\Http\Controllers;


use Illuminate\Http\Request;

use Illuminate\Support\Facades\Validator;


use App\Models\User;

use Auth;


class JWTAuthController extends Controller

{

    ....


    public function login(Request $request)

    {

        $validator = Validator::make(

            $request->all(),

            [

                'email' => 'required|email|max:255',

                'password' => 'required|string|min:8|max:255'

            ]

            );


        if ($validator->fails()) {

            return response()->json([

                'status' => 'error',

                'message' => $validator->getMessageBag()

            ], 200);

        }


        if (!$token = Auth::guard('api')->attempt(['email' => $request->email, 'password' => $request->password])) {

            return response()->json(['error' => 'Unauthorized'], 401);

        }


        return $this->responseWithToken($token);

    }


    private function responseWithToken($token)

    {

        return response()->json([

            'access_token' => $token,

            'token_type' => 'bearer',

            'expires_in' => Auth::guard('api')->factory()->getTTL() * 60

        ]);

    }

}

[/code]

 

Auth::guard('api')->attempt(..) 는 config/auth.php 에서 설정한대로 api guard 에 해당하는 방법으로 인증을 시도한다.

성공하면 토큰이 생성된다.

 

4. 라우트에 등록한다.

[code]

Route::post('/login', [JWTAuthController::class, 'login']);

[/code]

 

5. 앞전 포스팅에서 등록한 회원정보로 Postman 을 이용하여 로그인을 시도해 본다.

Method: Post,

FormData:

  email: [email protected]

  password: xxxxxxx

 

실행결과

[code]

{

    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sYXJhdmVsOC5rclwvYXBpXC9sb2dpbiIsImlhdCI6MTYxNDIzMTE1NSwiZXhwIjoxNjE0MjM0NzU1LCJuYmYiOjE2MTQyMzExNTUsImp0aSI6IjNQaGJZTUVRTnpqUWozdngiLCJzdWIiOjEsInBydiI6IjIzYmQ1Yzg5NDlmNjAwYWRiMzllNzAxYzQwMDg3MmRiN2E1OTc2ZjciLCJuYW1lIjoiXHVhZDhjXHVkNjAxXHVjOTAwIiwiZW1haWwiOiJpbXBhY3RsaWZlQG5hdmVyLmNvbSJ9.xQnH-CvxiUsFW2FHCNZ3wIF_o_hAerEsTmPLiY6IlEU",

    "token_type": "bearer",

    "expires_in": 3600

}

[/code]

댓글 0개

등록된 댓글이 없습니다.

Menu