과정요약
- User 모델에 JWTSubject 인터페이스를 구현한다.
- config/auth.php 에 api 인증방법을 jwt 로 수정한다.
- Controller 에 login() 메서드를 구현한다.
- 라우트에 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]