You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:22:47