Lumen 의 auth.php 의 설정
이 config 의 내용은 AuthManager 를 보면 이해가 간다.
여기서는 대략적으로 정리를 해 본다.
아래처럼 auth.php 가 있다고 하자.
아래 auth.php 를 대략적으로 이야기하면, api 라는 guard 를 쓰기로 되어 있고, api 라는 guard 는 실제적으로 jwt 라는 driver 로 이 guard 를 구현한다.
그리고 이 jwt 에서 사용되는 data 를 제공하는 provider 는 users 라는 이름을 가지고 있다. 이 users 라는 provider 는 eloquent 라는 driver 와 User 라는 model 을 이용해서 data 를 jwt 에 제공하게 된다.
<?php
// config/auth.php
return [
'defaults' => [
'guard' => env('AUTH_GUARD', 'api'),
],
'guards' => [
// 'api' => ['driver' => 'api'],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
'providers' => [
//
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
],
'passwords' => [
//
],
];
$this->auth->guard
이 guard 는 Middleware\Authenticate::handle 에서 $this->auth->guard 를 호출할 때 쓰인다. 만약 App\Http\Middleware\Authenticate::class 에서$this->auth->guard() 를 호출하지 않는다면, 'guard' 라는 이름을 굳이 사용하지 않아도 된다.
참고로, Tymon\JWTAuth\Middleware\Authenticate::class 에서는 $this->auth->guard() 를 호출하지 않는다. 그래서 처음에는 'guard' 설정을 굳이 안해줘도 되겠다 싶었지만,
Tymon\JWTAuth\Providers\AbstractServiceProvider::registerJWTAuth() 에서 'auth' 를 parameter 로 넘기기 때문에 설정은 해줘야 한다.
default
여기서 맨 처음 defaults 부분을 보자.'defaults' => [
'guard' => env('AUTH_GUARD', 'api'),
],
이 녀석은 처음 AuthManager->guard() 를 호출할 때 사용된다. getDefaultDriver() 에서 auth.php 의 guard 부분을 가져오게 된다.
// Illuminate\Auth\AuthManager
public function guard($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return isset($this->guards[$name])
? $this->guards[$name]
: $this->guards[$name] = $this->resolve($name);
}
public function getDefaultDriver()
{
return $this->app['config']['auth.defaults.guard'];
}
guards
그 다음으로 resolve() 를 가게 된다. 처음에 $this->guards[$name] 가 전혀 set 되어 있지 않으니, 결국 $this->reslove($name) 을 실행하게 된다. 여기서 getConfig() 를 통해 auth.php 의 'guard' 부분을 사용하게 된다. 그래서 아래 소스의 경우는 'driver' 가 'jwt' 가 된다.'guards' => [
// 'api' => ['driver' => 'api'],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
// Illuminate\Auth\AuthManager
protected function resolve($name)
{
$config = $this->getConfig($name); // $name 이 api 이다.
if (is_null($config)) {
throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");
}
if (isset($this->customCreators[$config['driver']])) {
return $this->callCustomCreator($name, $config);
}
$driverMethod = 'create'.ucfirst($config['driver']).'Driver';
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($name, $config);
}
throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined.");
}
protected function getConfig($name)
{
return $this->app['config']["auth.guards.{$name}"];
}
여기서 설정한 'jwt' 는 lumen 에서 기본적으로 제공하는 녀석은 아니다. 여기선 tymon/jwt-auth 를 이용한 것이다. 이런 새로운 driver 를 등록해서 사용하는 방법은 ref. 1 을 참고하면 대략적으로 알 수 있다.
여기서tymon/jwt-auth 의 소스로 이야기를 하면 'jwt'는 app.php 에 등록한 LumenServiceProvider에 보면 extendAuthGuard() 를 호출하는데, 이 extendAuthGuard() 에서 등록하게 된다. 즉 custom service provider 를 app.php 에 등록하고, 이 service provider 의 boot() 하는 때에 auth에 custom Guard 를 등록해주면 되는 것이다.($this->app['auth']->extend('jwt', ...)
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
class LumenServiceProvider extends AbstractServiceProvider
{
public function boot()
{
$this->app->configure('jwt');
$path = realpath(__DIR__.'/../../config/config.php');
$this->mergeConfigFrom($path, 'jwt');
$this->app->routeMiddleware($this->middlewareAliases);
$this->extendAuthGuard();
$this->app['tymon.jwt.parser']->setChain([
new AuthHeaders,
new QueryString,
new InputSource,
new LumenRouteParams,
]);
}
}
// Tymon\JWTAuth\Providers\AbstractServiceProvider
protected function extendAuthGuard()
{
$this->app['auth']->extend('jwt', function ($app, $name, array $config) {
$guard = new JwtGuard(
$app['tymon.jwt'],
$app['auth']->createUserProvider($config['provider']),
$app['request']
);
$app->refresh('request', $guard, 'setRequest');
return $guard;
});
}
// Illuminate\Auth\CreateUserProvider
public function createUserProvider($provider)
{
$config = $this->app['config']['auth.providers.'.$provider];
if (isset($this->customProviderCreators[$config['driver']])) {
return call_user_func(
$this->customProviderCreators[$config['driver']], $this->app, $config
);
}
switch ($config['driver']) {
case 'database':
return $this->createDatabaseProvider($config);
case 'eloquent':
return $this->createEloquentProvider($config);
default:
throw new InvalidArgumentException("Authentication user provider [{$config['driver']}] is not defined.");
}
}
provider
그리고 provider 는 위의 소스를 보면 알 수 있지만, 위처럼 Guard 를 만들때 같이 parameter 로 넘기는데, 이때 넘기는 provider 가 어떤 provider 인지 알려주는 것이라 보면 된다.providers
그러고 나서 아래 createUserProvider 함수내에서 auth.php 의 ‘providers’ 설정을 가져오게 된다.
$app[‘auth’]->createUserProvider($config[‘provider’])
위의 소스를 보면 알 수 있듯이 'driver' 에 맞는 Provider 를 만들어 준다.그리고 ‘model’ 은 ‘driver’에 지정한 provider에서 사용할 model 이다.
'providers' => [
//
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
],
위와 같은 설정이 되어 있다면, 최종적으로 EloquentUserProvider 가 사용되는 것이고,
EloquentUserProvider안에서 사용할 model 은 App\User 가 되는 것이다.
그리고 이 EloquentUserProvider 가 JWTGuard 에 parameter 로 넘어가서 여러가지 auth 관련 작업을 할 때 쓰이는 provider 가 된다.
구체적인 소스코드는 ref. 2 를 참고하자.
Reference
- php - How to get login with different database table column name in Laravel 5.2? - Stack Overflow
- https://github.com/akaita/json-web-token-authentication-for-lumen-5
댓글 없음:
댓글 쓰기