Laravel 8 API使用Passport时如何登出并撤销所有OAuth令牌
问题原因
- 你调用的
revoke()方法本身就不会删除oauth_access_tokens表的条目,只是将对应条目的revoked字段标记为1,表示令牌失效,所以数据库条目会保留。 - 你现有代码仅处理当前请求携带的单条令牌,就算做删除操作也只能实现单设备登出,无法满足全设备登出的需求。
修复方案
场景1:全设备登出(删除当前用户所有令牌)
直接调用tokens()关系的delete()方法批量删除对应用户的所有令牌,修改后的logout方法如下:
public function logout(Request $request){ // 直接清空该用户所有access token记录 $request->user()->tokens()->delete(); return response(['message'=> 'Je bent uitgelogd'], 200); }
场景2:仅当前设备登出(仅删除当前请求使用的令牌)
如果不需要全设备登出,仅失效当前请求用的令牌,可以用以下写法:
public function logout(Request $request){ // 仅删除当前请求携带的这一条令牌记录 $request->user()->currentAccessToken()->delete(); return response(['message'=> 'Je bent uitgelogd'], 200); }
补充说明
- 确保你的
User模型已经引入了Passport提供的Laravel\Passport\HasApiTokenstrait,否则无法调用tokens()、currentAccessToken()等方法。 - 如果你同时使用了refresh token功能,删除access token后也可以同步清理对应的refresh token记录,避免残留无效数据。
内容的提问来源于stack exchange,提问作者M.Koops
相关产品推荐
相关产品推荐

