Laravel Sanctum令牌无法撤销问题排查(Laravel 11)
解决Laravel 11 Sanctum令牌无法撤销的问题
针对你遇到的令牌删除后仍能通过认证的问题,可按以下步骤排查解决:
确认令牌是否真的被删除
在destroy方法中添加日志验证是否正确获取并删除了当前访问令牌:public function destroy(Request $request){ $currentToken = $request->user('sanctum')->currentAccessToken(); \Log::debug('当前要删除的令牌ID:'.$currentToken->id); $currentToken->delete(); // 也可尝试用 revoke() 标记令牌为已撤销 // $currentToken->revoke(); return response(null, 204); }同时查看数据库
personal_access_tokens表,确认请求后对应令牌记录是否被删除(或revoked_at字段是否填充)。若记录未变化,需检查数据库连接、事务设置等是否正常。验证路由中间件是否正确生效
确保destroy路由确实绑定了auth:sanctum中间件,路由定义应类似:Route::delete('/tokens', [TokenController::class, 'destroy'])->middleware('auth:sanctum');若中间件未正确应用,即使令牌被删除,请求仍能绕过认证逻辑。
检查测试方式是否有误
测试时需确保第二次请求使用的是同一个已被删除的令牌,避免测试工具(如Postman、Insomnia)自动替换为新生成的令牌。手动复制第一次获取的明文令牌,在请求头中按Bearer {plainTextToken}格式传递。尝试批量删除验证
暂时替换currentAccessToken()->delete()为删除用户所有令牌的逻辑,测试是否能触发401:public function destroy(Request $request){ $request->user('sanctum')->tokens()->delete(); return response(null, 204); }如果此操作后请求返回401,说明
currentAccessToken()未正确识别当前请求的令牌,需检查令牌传递方式是否符合Sanctum要求(如是否使用Bearer头、是否存在其他认证冲突)。排查Sanctum配置问题
打开config/sanctum.php,确认以下配置:hash_tokens是否为true(默认开启),确保令牌以哈希形式存储,验证时正确比对;- 未自定义
token_model导致验证逻辑异常; - 无其他自定义认证逻辑干扰Sanctum的令牌验证流程。
内容的提问来源于stack exchange,提问作者inf3rno
相关产品推荐
相关产品推荐

