使用Laravel Lumen + Passport获取经过身份验证的用户的问题

问题描述 投票:1回答:1

我正在使用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.将这些令牌存储在一个安全的仅限http的cookie中 3.在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的文档,这就是boot方法的样子。当然它使用“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使用适当的Authorization标头访问这些端点。

我需要检索用户的原因是因为我希望在我的注销方法中,我将能够检索该经过身份验证的用户的accessToken并撤消令牌并清除cookie。

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));
    }
laravel oauth-2.0 lumen laravel-passport
1个回答
0
投票

此时你不能使用Auth::user(),因为该功能是解决它的功能。因此,您需要做的是使用$request->bearerToken()提取持有人令牌并使用它来检索您的用户。

更新我看了你的代码,我会建议如下:

建议API为“无状态”,这意味着它不应该持久存在任何状态(即cookie)。最好是为每个请求传递访问令牌,让访问API的应用程序处理令牌。因此,我建议删除注销功能。然后你可以在AuthServiceProvider中执行以下操作:

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

     return $user;
 }
© www.soinside.com 2019 - 2024. All rights reserved.