我用passport和laravel 8构建的api默认不会注销。
我找到了一个脚本,但是它没有删除oauth-access-tokens表中的条目
我给AuthController添加了一个函数:
public function logout(Request $request){
$accessToken = auth()->user()->token();
$token= $request->user()->tokens->find($accessToken);
$token->revoke();
return response(['message'=> 'Je bent uitgelogd'], 200);
}
并在api.php中添加了一个路径:
Route::post( 'logout', 'AppHttpControllersAPIAuthController@logout')->middleware('auth:api');
当我尝试使用Postman注销时,我得到一条成功消息,但是oauth-access-token表中的条目没有被删除。
我打算为用户删除所有令牌,从所有设备注销
谁能告诉我我做错了什么?将注销功能更改为:
public function logout(Request $request){
$user = Auth::user()->token();
$user->revoke();
return response(['message'=> 'Je bent uitgelogd'], 200);
}
这将使用户从他请求注销的当前设备注销。如果你想注销他登录过的所有设备。然后这样做:
use LaravelPassportRefreshToken;
use LaravelPassportToken;
public function logout(Request $request){
$tokens = $user->tokens->pluck('id');
Token::whereIn('id', $tokens)->update(['revoked', true]);
RefreshToken::whereIn('access_token_id', $tokens)->update(['revoked' => true]);
}
这将撤销发给该用户的所有访问和刷新令牌。
SOLVED:
我使用了以下代码:
use AppHttpControllersController;
use IlluminateHttpRequest;
use AppModelsUser;
use IlluminateSupportFacadesAuth;
和功能:
public function logout(Request $request){
Auth::user()->tokens->each(function($token, $key) {
$token->delete();
});
return response(['message'=> 'Je bent uitgelogd'], 200);
}
所以没有任何东西被撤销,但是所有的令牌都被删除了。
如果您使用护照,身份验证:用户()→AauthAcessToken()→删除();将删除用户的所有令牌。
在AuthController中,我使用以下代码
public function logout(Request $request) {
$request->user()->token()->revoke();
return response([
"message" => 'Session finished',
],200);
}