laravel/passport for middleware('auth:api') Отправка мультизапроса в базу данных

Я использую https://laravel.com/docs/5.4/passport для аутентификации пользователя, если паспорт основан на JWT, зачем отправлять несколько запросов в базу данных для проверки промежуточного программного обеспечения ('auth:api')?

1 ответ

Редактировать Я думаю, что заблуждение заключается в том, что использование JWT подразумевает аутентификацию без сохранения состояния. Вы можете сохранить состояние маркера клиента на сервере и сохранить JWT вместе с клиентом и проверить это с помощью вызовов базы данных (Laravel Passport), но в этом есть свои плюсы и минусы.


auth:api промежуточное программное обеспечение / охрана с состоянием (не без сохранения состояния). Вам нужно будет использовать другой пакет или создать свое собственное промежуточное программное обеспечение / сторож, который использует аутентификацию без сохранения состояния.

Вначале это меня тоже смутило, так как $user->createToken()->accessToken; возвращает JSON Web Token (JWT), и я предполагал, что аутентификация без сохранения состояния (неверное предположение).

Чтобы понять, как это происходит в рамках:

В промежуточном программном обеспечении auth: api используется защита api (определена в config/auth.php по умолчанию). Драйвер для этого Laravel\Passport\PassportServiceProvider.php который регистрирует Laravel\Passport\Guards\TokenGuard.php

Именно TokenGuard проверяет заголовок авторизации и токен на предъявителя. Если токен на предъявителя найден, то охранник пытается аутентифицировать пользователя через authenticateViaBearerToken функция внутри TokenGuard.php. При этом выполняются различные вызовы базы данных для извлечения пользователя, создания объекта токена и определения, был ли токен отозван.

Здесь authenticateViaBearerToken начиная с Laravel v5.6 (для ясности удалены комментарии):

/**
 * Authenticate the incoming request via the Bearer token.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return mixed
 */
protected function authenticateViaBearerToken($request)
{
    $psr = (new DiactorosFactory)->createRequest($request);
    try {
        $psr = $this->server->validateAuthenticatedRequest($psr);

        $user = $this->provider->retrieveById(
            $psr->getAttribute('oauth_user_id')
        );
        if (! $user) {
            return;
        }

        $token = $this->tokens->find(
            $psr->getAttribute('oauth_access_token_id')
        );
        $clientId = $psr->getAttribute('oauth_client_id');

        if ($this->clients->revoked($clientId)) {
            return;
        }
        return $token ? $user->withAccessToken($token) : null;
    } catch (OAuthServerException $e) {
        $request->headers->set( 'Authorization', '', true );
        Container::getInstance()->make(
            ExceptionHandler::class
        )->report($e);
    }
}
Другие вопросы по тегам