[컴][php] Lumen 의 auth.php 의 설정

루먼의 설정 / 루먼 config / lumen 에서 설정하는 방법 / auth 설정


Lumen 의 auth.php 의 설정


config/auth.php 를 추가하면, configuration 으로 auth.php 를 이용하게 된다. auth.php 는 auth(인증)과 관련돼서 어떤 녀석을 사용할지에 대한 것을 정해 주는 것이라고 보면 된다.

이 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

  1. php - How to get login with different database table column name in Laravel 5.2? - Stack Overflow
  2. https://github.com/akaita/json-web-token-authentication-for-lumen-5



댓글 없음:

댓글 쓰기