요약
- 컨트롤러에 사용자정보를 처리하는 user() 메서드를 만든다.
- 1번의 라우터를 추가하고 인증실패에 대한 라우터도 추가한다.
- Authenticate 미들웨어 redirectTo() 함수에 api에 대한 처리를 추가한다.
1. app\Http\Controllers\JWTAuthController.php 열고 user() 메서드를 추가한다.
[code]
class JWTAuthController extends Controller
{
…
public function user()
{
return response()->json(Auth::guard(‘api’)->user());
}
}
[/code]
Auth 는 \vendor\laravel\framework\src\Illuminate\Auth\AuthManager 를 불러오는 Facade 이며
Facade는 \vendor\laravel\framework\src\Illuminate\Support\Facades\Auth.php 에 정의되어 있으며 config/app.php 에 alias 로 선언되어 있다
Auth::guard() 는 인자에 따른 인증드라이버를 호출한다.
config/auth.php 에서 설정한대로 ‘web’이면 세션드라이버(SessionGuard), ‘api’ 이면 토큰드라이버(TokenGuard)를 가져온다.
user() 는 주어진 Provider 로 토큰인증을 통해 성공하면 해당유저정보를, 실패하면 null 이 리턴된다.
2. 라우트를 추가한다. 이때 인증되지 않은 사용자용 라우트도 함께 추가한다.
[code]
// 인증되지 않은 사용자용
Route::get(‘unauthorized’, function() {
return response()->json([
‘status’ => ‘error’,
‘message’ => ‘Unauthorized’
], 401);
})->name(‘api.jwt.unauthorized’);
// 사용자 정보
Route::group([‘middleware’ => ‘auth:api’], function() {
Route::get(‘user’, [JWTAuthController::class, ‘user’])->name(‘api.jwt.user’);
});
[/code]
[‘middleware’ => ‘auth:api’] 에서 auth:api 는 auth alias 로 지정된 미들웨어를 호출하는데 이때 : 뒤에 api 는 미들웨어의 handle 메소드 가장 마지막에 추가로 전달되는 문자열 인자이다. Authenticate 메소드에 아래와 같이 …$guards 로 정의 되어 있다.
class Authenticate implements AuthenticatesRequests
{
public function handle($request, Closure $next, …$guards)
{
….
}
}
3. api/Http/Middleware/Authenticate.php 를 열고 redirectTo() 메서드에 api 일 경우 분기시키는 코드를 추가한다.
[code]
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
// api 로 호출했을때
if ($request->expectsJson() || $request->is(‘api/*’)) {
return route(‘api.jwt.unauthorized’);
}
// web 으로 호출했을때
return route(‘login’);
}
}
[/code]
Illuminate\Auth\Middleware\Authenticate 를 상속하였기때문에 인증과 관련된 모든 처리는 부모 클래스에서 처리한다.
처리 후 인증실패이면 이동하는 메서드인 redirectTo() 만 재정의한다.
4. Postman 을 열고 Authorization 탭에서 Bearer Token 을 선택하고 앞전 포스팅에서 구한 토큰값을 입력한 뒤 실행한다.
실행결과
[code]
{
“id”: 1,
“name”: “홍길동”,
“email”: “[email protected]”,
“email_verified_at”: null,
“created_at”: “2021-02-25T04:45:13.000000Z”,
“updated_at”: “2021-02-25T04:45:13.000000Z”
}
[/code]