Изучите аутентификацию пользователей Lumen (1)

задняя часть Безопасность API Laravel

Прошло много времени с тех пор, как я писал PHP-код, особенно Lumen, я большой пользователь Lumen, и я использовал Lumen в качестве основного фреймворка для своего API с момента его создания.

Но когда дело доходит до API, есть концепция, которую я должен сказать: «Разделение фронтенда и бекенда».Сейчас все больше и больше команд принимают разделение фронтенда и бекенда, что полностью высвобождает преимущества фронтенда. и позволяет серверной части больше сосредоточиться на выводе данных. Обсуждение этого аспекта здесь не обсуждается, и вы можете обратиться к некоторым статьям для дальнейшего изучения:

сегмент fault.com/ah/119000000…

Из-за разделения фронтенда и бекенда бэкенд сосредоточился на выводе интерфейсного API.В то время Lumen родился для RESTful API:

Decidedly Laravel. Delightfully Minimal.

Lightning fast micro-services and APIs delivered with the elegance you expect.

Использование Lumen в качестве фреймворка интерфейса должно решить основную проблему: как «аутентифицировать» посетителей.

Аутентификация пользователя

Хотя Lumen использует ту же реализацию базовой библиотеки классов, что и Laravel, поскольку Lumen нацелен на разработку API без сохранения состояния и не поддерживает сеансы, конфигурация по умолчанию отличается. Lumen должен быть реализован с использованием механизма без сохранения состояния, такого как токен API.

Давайте посмотрим на примеры, представленные на официальном сайте Lumen:

use Illuminate\Http\Request;

$app->get('/post/{id}', ['middleware' => 'auth', function (Request $request, $id) {
    $user = Auth::user();

    $user = $request->user();

    //
}]);

Который использует промежуточное ПО:'middleware' => 'auth', давайте посмотрим на промежуточную функцию аутентификации:

$app->routeMiddleware([
     'auth' => App\Http\Middleware\Authenticate::class,
 ]);

В связи с классом Authenticate давайте посмотрим на функцию дескриптора Authenticate:

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if ($this->auth->guard($guard)->guest()) {
            return response('Unauthorized.', 401);
        }

        return $next($request);
    }

первый судья$this->auth->guard($guard)->guest(). Мы продолжаем следить за кодом, чтобыAuthManagerсередина:

/**
     * Attempt to get the guard from the local cache.
     *
     * @param  string  $name
     * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard
     */
    public function guard($name = null)
    {
        $name = $name ?: $this->getDefaultDriver();

        return isset($this->guards[$name])
                    ? $this->guards[$name]
                    : $this->guards[$name] = $this->resolve($name);
    }

входящий по умолчанию$name = null, так что смотрим$this->getDefaultDriver():

/**
     * Get the default authentication driver name.
     *
     * @return string
     */
    public function getDefaultDriver()
    {
        return $this->app['config']['auth.defaults.guard'];
    }

Это приводит нас к конфигурации конфигурации по умолчанию:

Из исходного кода Lumen мы видим, что метод аутентификации Lumen по умолчанию — «api».

Давайте посмотрим на метод аутентификации Laravel по умолчанию:

Laravel по умолчанию использует «веб-метод», а веб-метод использует сеанс для аутентификации пользователя. Это также хорошая иллюстрация безгражданства Lumen.

Далее нам нужно понять, как Lumen аутентифицирует пользователей через «API».

AuthServiceProvider находится в папке app/Providers, и в этом файле есть только один вызов Auth::viaRequest. viaRequest будет вызываться, когда системе потребуется аутентификация. Этот метод принимает в качестве параметра анонимную функцию. В этой анонимной функции вы можете произвольно анализировать приложение\пользователя и возвращать его или возвращать значение null, когда синтаксический анализ завершается неудачно, например:

/**
     * Boot the authentication services for the application.
     *
     * @return void
     */
    public function boot()
    {
        // Here you may define how you wish users to be authenticated for your Lumen
        // application. The callback which receives the incoming request instance
        // should return either a User instance or null. You're free to obtain
        // the User instance via an API token or any other method necessary.

        $this->app['auth']->viaRequest('api', function ($request) {
            if ($request->input('api_token')) {
                return User::where('api_token', $request->input('api_token'))->first();
            }
        });
    }

Давайте посмотримviaRequestфункция:

/**
     * Register a new callback based request guard.
     *
     * @param  string  $driver
     * @param  callable  $callback
     * @return $this
     */
    public function viaRequest($driver, callable $callback)
    {
        return $this->extend($driver, function () use ($callback) {
            $guard = new RequestGuard($callback, $this->app['request'], $this->createUserProvider());

            $this->app->refresh('request', $guard, 'setRequest');

            return $guard;
        });
    }

Ключ здесьRequestGuard, основная функция этого класса:

/**
     * Get the currently authenticated user.
     *
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function user()
    {
        // If we've already retrieved the user for the current request we can just
        // return it back immediately. We do not want to fetch the user data on
        // every call to this method because that would be tremendously slow.
        if (! is_null($this->user)) {
            return $this->user;
        }

        return $this->user = call_user_func(
            $this->callback, $this->request, $this->getProvider()
        );
    }

Это делается для того, чтобы определить, следует ли получать информацию о пользователе, в основном путем вызоваcallbackфункция, и эта функция есть то, что мы получаем изviaRequestВходящие:

function ($request) {
    if ($request->input('api_token')) {
                return User::where('api_token', $request->input('api_token'))->first();
            }
        }

И это всего лишь пример аутентификации пользователя, судя по входящему запросуapi_tokenпараметры и получить User или null с помощью прямого поиска совпадения User Model.

Конечно, в реальной разработке мы не можем просто получитьapi_tokenНепосредственно свяжите базу данных, чтобы найти информацию о пользователе.

При разработке API аутентификация пользователя является основным и обязательным условием безопасности данных.В настоящее время существует два распространенных метода аутентификации пользователей: JWT и OAuth2.

Следующий шаг

В настоящее время у меня есть только краткое представление о «аутентификации пользователя» Lumen.Следующий шаг — узнать о «JWT», чтобы увидеть, как использовать JWT для эффективной аутентификации пользователя и более безопасно обеспечить доступ к информации интерфейса эффективные пользователи.

Прикрепил:
Веб-токен Json (JWT) — это открытый стандарт на основе JSON (RFC 7519), реализованный для передачи утверждений между средами веб-приложений. Маркер разработан, чтобы быть компактным и безопасным, особенно для сценариев единого входа (SSO) для распределенных сайтов. Заявки JWT обычно используются для передачи аутентифицированной информации об удостоверении пользователя между поставщиками удостоверений и поставщиками услуг для получения ресурсов с серверов ресурсов, а также могут добавлять некоторую дополнительную информацию о заявке, необходимую для другой бизнес-логики.Можно использовать непосредственно для проверки подлинности или зашифровать.

"Продолжение следует"


coding01 с нетерпением ждет вашего дальнейшего внимания

qrcode
qrcode