我正在使用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));
}
此时你不能使用Auth::user()
,因为该功能是解决它的功能。因此,您需要做的是使用$request->bearerToken()
提取持有人令牌并使用它来检索您的用户。
更新我看了你的代码,我会建议如下:
建议API为“无状态”,这意味着它不应该持久存在任何状态(即cookie)。最好是为每个请求传递访问令牌,让访问API的应用程序处理令牌。因此,我建议删除注销功能。然后你可以在AuthServiceProvider
中执行以下操作:
if ($token_exists) {
$user = User::find($token->user_id);
return $user;
}