如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?
Posted
技术标签:
【中文标题】如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?【英文标题】:How can I logout and revoke all oauth tokens in laravel 8 api? 【发布时间】:2021-12-03 19:42:10 【问题描述】:我用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', 'App\Http\Controllers\API\AuthController@logout')->middleware('auth:api');
当我尝试使用 Postman 注销时,我收到一条成功消息,但未删除 oauth-access-token 表中的条目。
我打算为用户删除所有令牌,以便从所有设备中注销
谁能告诉我我做错了什么?
【问题讨论】:
【参考方案1】:如果您使用的是护照, Auth::user()->AauthAcessToken()->delete(); 将删除用户的所有令牌。
【讨论】:
【参考方案2】:已解决:
我使用了以下代码:
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
和功能:
public function logout(Request $request)
Auth::user()->tokens->each(function($token, $key)
$token->delete();
);
return response(['message'=> 'Je bent uitgelogd'], 200);
所以没有任何东西被撤销,但是所有的令牌都被删除了..
【讨论】:
【参考方案3】:将注销功能改成如下:
public function logout(Request $request)
$user = Auth::user()->token();
$user->revoke();
return response(['message'=> 'Je bent uitgelogd'], 200);
这将使用户从他请求注销的当前设备中注销。如果你想从他登录的所有设备上注销。然后这样做:
use Laravel\Passport\RefreshToken;
use Laravel\Passport\Token;
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]);
这将撤销颁发给该用户的所有访问和刷新令牌。
【讨论】:
谢谢,试过了。不幸的是不起作用。我在 VS CODE 中有一个警告:“未定义的方法 'token'.intelephense(1013)”。我认为这是由于 vs 代码中的设置。第一个解决方案显示成功响应,但 oauth-access-tokens 中的条目仍然存在。我不能两次发帖,因为我是未经授权的。所以它让我退出,但不会从表中删除条目..我猜。第二个函数返回:“消息”:“在 null 上调用成员函数 pluck()”,作为响应。 现在我看到 $request 从未在您描述的函数中使用过...不应该 AUTH 从令牌中提取用户吗?以上是关于如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
Sanctum Laravel 8 用于 API 身份验证的问题(不会在注销时删除令牌)