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

Laravel 11中PersonalAccessToken调用findToken始终返回null问题

Laravel Sanctum findToken 返回null的排查与解决

核心问题原因

findToken方法需要传入的是令牌的纯哈希部分,而非数据库中存储的带前缀的完整令牌(如11|QC3NXdRq...格式)。数据库personal_access_tokens表的token字段存储的是哈希值,用户拿到的完整令牌是ID|哈希的组合,必须截取|后的哈希部分传入方法。

具体解决步骤

  1. 修正令牌传入格式
    截取完整令牌中的哈希部分,再传入findToken:

    $fullToken = "11|QC3NXdRq8mPUCVeAttMv8XxXoDTysRwRxLnfB6YLafcf585";
    $hashToken = substr($fullToken, strpos($fullToken, '|') + 1);
    $token = PersonalAccessToken::findToken($hashToken);
    
  2. 检查令牌状态
    查看personal_access_tokens表:

    • 确认expires_at字段未过期
    • 确认revoked字段为false(未被撤销)
  3. 验证模型与配置

    • 确保引入正确的模型:use Laravel\Sanctum\PersonalAccessToken;
    • 检查config/auth.php中sanctum guard的provider指向正确的用户模型

修正后的完整代码

use Laravel\Sanctum\PersonalAccessToken;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AuthCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $fullToken = "11|QC3NXdRq8mPUCVeAttMv8XxXoDTysRwRxLnfB6YLafcf585";
        $hashToken = substr($fullToken, strpos($fullToken, '|') + 1);
        
        $token = PersonalAccessToken::findToken($hashToken);
        
        if(!$token){
            return response()->json(['message' =>"token not found","token"=>$token], status: 401);
        }

        return $next($request);
    }
}

内容的提问来源于stack exchange,提问作者amoke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:12:07