Проблема получения аутентифицированного пользователя с Laravel Lumen + Passport - PullRequest
0 голосов
/ 28 февраля 2019

Я использую LumenPassport (https://github.com/dusterio/lumen-passport) и следовал нескольким учебникам, перечисленным здесь.

Я использовал комбинацию этих учебников, а также чертовски поиски в Google и stackoverflow, чтобы добиться того, что ядо сих пор:http://esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4/
http://esbenp.github.io/2015/05/26/lumen-web-api-oauth-2-authentication/
https://blog.pusher.com/make-an-oauth2-server-using-laravel-passport/

Чего я добился до сих пор1. Использование пароля для получения токена доступа и обновления2. Хранение этих токенов в безопасном файле cookie только для http3. Получение этих токенов в Lumen AuthServiceProvider

Что я не могу сделать1. Получение аутентифицированного пользователя с помощью AccessToken

Я пытаюсь получить доступ к любой из следующих конечных точек:

$router->group(['middleware' => 'auth:api'], function () use ($router) {
    $router->get('/', function () use ($router) {return $router->app->version();});
    $router->post('/logout', '\App\Auth\LoginController@logout');
});

Я немедленно получу несанкционированную ошибку. После некоторого глубокого погружения ошибкапроисходит от Authenticate.php, который, как я знаю, вызывается после AuthServiceProvider.Я взглянул на AuthServiceProvider и, согласно документации Lumen, так должен выглядеть метод загрузки.Конечно, он использует драйвер «api», и мне пришлось переключить его на «паспорт», чтобы он работал.

AuthServiceProvider.php

public function boot()
{
    $this->app['auth']->viaRequest('passport', function ($request) {
         // dd("test") // this works
         // dd(Auth::user());
         // dd($request->user());
         // dd(Auth::guard('api')->user());
    });
}

Authenticate.php

public function handle($request, Closure $next, $guard = null)
{
    if ($this->auth->guard($guard)->guest()) {
        $status = Response::HTTP_UNAUTHORIZED;
        return response()->json(['success' => false, 'status' => $status, 'message' => 'HTTP_UNAUTHORIZED'], $status);
    }
    return $next($request);
}

С этого момента я все еще не могу получить какую-либо информацию аутентифицированного пользователя.Я обеспечил доступ к этим конечным точкам через Postman с соответствующими заголовками авторизации.

Причина, по которой мне нужно получить пользователя, заключается в том, что я надеюсь, что в моем методе выхода из системы я смогу затем получить accessTokenэтого аутентифицированного пользователя, отмените токен и удалите куки.

LoginController.php

public function logout()
    {
        // Get the accessToken from Auth
        // Need to fix AuthServiceProvider first
        $accessToken = $this->auth->user()->token();
        $refreshToken = $this->db
            ->table('oauth_refresh_tokens')
            ->where('access_token_id', $accessToken->id)
            ->update([
                'revoked' => true,
            ]);

        $accessToken->revoke();

        $this->cookie->queue($this->cookie->forget(self::REFRESH_TOKEN));
    }

1 Ответ

0 голосов
/ 01 марта 2019

В этот момент вы не можете использовать Auth::user(), так как эта функция является функцией для ее разрешения.Поэтому вам нужно извлечь токен на предъявителя с помощью $request->bearerToken() и использовать его для получения вашего пользователя.

Обновление Я посмотрел ваш код и рекомендовал бы следующее:

Рекомендуется, чтобы API был «не сохраняющим состояние», что означает, что он не должен сохранять никакого состояния (например, куки).Гораздо лучше передавать токен доступа при каждом запросе, а приложение, которое обращается к вашему API, обрабатывает токены.Поэтому я бы порекомендовал удалить функцию выхода из системы.Тогда вы можете сделать следующее в вашем AuthServiceProvider:

 if ($token_exists) {
     $user = User::find($token->user_id);

     return $user;
 }
...