使用Laravel Lumen + Passport获得身份验证用户时出现问题

时间:2019-02-28 13:36:06

标签: laravel oauth-2.0 lumen laravel-passport

我正在使用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的文档,这就是启动方法的样子。当然,它使用的是“ api”驱动程序,我不得不将其切换为“ passport”才能正常工作。

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);
}

从这里,我仍然无法获得任何经过身份验证的用户的信息。我已确保使用具有适当的Authorization标头的Postman访问这些端点。

之所以需要检索用户,是因为我希望我的注销方法能够检索经过身份验证的用户的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));
    }

1 个答案:

答案 0 :(得分:0)

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

更新 我查看了您的代码,并建议以下内容:

建议API为“无状态”,这意味着它不应保留任何状态(即Cookie)。最好随每个请求传递访问令牌,并让访问您的API的应用程序处理这些令牌。因此,我建议删除注销功能。然后,您可以在AuthServiceProvider中进行以下操作:

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

     return $user;
 }