Laravel 11中PersonalAccessToken调用findToken始终返回null问题
Laravel Sanctum findToken 返回null的排查与解决
核心问题原因
findToken方法需要传入的是令牌的纯哈希部分,而非数据库中存储的带前缀的完整令牌(如11|QC3NXdRq...格式)。数据库personal_access_tokens表的token字段存储的是哈希值,用户拿到的完整令牌是ID|哈希的组合,必须截取|后的哈希部分传入方法。
具体解决步骤
修正令牌传入格式
截取完整令牌中的哈希部分,再传入findToken:$fullToken = "11|QC3NXdRq8mPUCVeAttMv8XxXoDTysRwRxLnfB6YLafcf585"; $hashToken = substr($fullToken, strpos($fullToken, '|') + 1); $token = PersonalAccessToken::findToken($hashToken);检查令牌状态
查看personal_access_tokens表:- 确认
expires_at字段未过期 - 确认
revoked字段为false(未被撤销)
- 确认
验证模型与配置
- 确保引入正确的模型:
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
相关产品推荐
相关产品推荐

