我正在使用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));
}
答案 0 :(得分:0)
那时候您不能使用Auth::user()
,因为该功能是解决该问题的功能。因此,您需要做的是使用$request->bearerToken()
提取承载令牌并使用它来检索您的用户。
更新 我查看了您的代码,并建议以下内容:
建议API为“无状态”,这意味着它不应保留任何状态(即Cookie)。最好随每个请求传递访问令牌,并让访问您的API的应用程序处理这些令牌。因此,我建议删除注销功能。然后,您可以在AuthServiceProvider
中进行以下操作:
if ($token_exists) {
$user = User::find($token->user_id);
return $user;
}