Symfony 6 + API Platform集成JWT认证时返回"Invalid credentials"错误排查求助
排查Symfony 6 API Platform JWT认证401 Invalid Credentials问题
我之前在Symfony 6项目里也碰到过一模一样的问题,咱们一步步来排查:
1. 最常见的原因:密码未正确哈希
这是90%概率会踩的坑——你数据库里的用户密码是不是直接存的明文?Symfony的密码验证逻辑是拿输入的明文和数据库里的哈希值比对,明文肯定通不过校验。
解决办法:
- 创建用户时必须用Symfony的
UserPasswordHasherInterface来哈希密码,比如在数据填充类或者注册控制器里:
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; // 注入密码哈希器 public function __construct(private UserPasswordHasherInterface $passwordHasher) {} // 创建用户的逻辑 $user = new User(); $user->setEmail('toto@gmail.com'); // 对明文密码进行哈希处理 $hashedPassword = $this->passwordHasher->hashPassword($user, 'string2222'); $user->setPassword($hashedPassword);
- 如果是手动在数据库插入的用户,赶紧删掉,用控制台命令重新创建:
php bin/console make:user
跟着提示输入邮箱和密码,Symfony会自动帮你完成密码哈希。
2. 检查Symfony版本与PUBLIC_ACCESS兼容性
看你的security.yaml里用了PUBLIC_ACCESS角色,这个是Symfony 6.1及以上版本才内置的!如果你用的是Symfony 6.0,这个角色不存在,会导致/authentication_token路径被错误地要求认证,虽然错误信息是Invalid credentials,但也有可能是这个原因导致的。
解决办法:把access_control里的PUBLIC_ACCESS替换成IS_AUTHENTICATED_ANONYMOUSLY:
access_control: - { path: ^/docs, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/authentication_token, roles: IS_AUTHENTICATED_ANONYMOUSLY }
3. 确认路由与防火墙配置匹配
- 执行
php bin/console debug:router,查看是否存在/authentication_token的路由?虽然json_login的check_path会自动生成路由,但有时候路由冲突会导致认证接口无法正常响应。 - 检查防火墙顺序:你的
api防火墙在main前面,但/authentication_token不在^/api/路径下,所以会走main防火墙,这个配置是正确的,无需调整。
4. 开启调试日志定位精准原因
把.env里的APP_DEBUG=1打开,然后查看var/log/dev.log,里面会有认证失败的详细日志:
- 如果日志显示
User not found:说明用户提供者找不到对应邮箱的用户,检查数据库里的邮箱是否和请求里的完全一致(注意大小写,部分数据库是大小写敏感的)。 - 如果日志显示
Invalid password:那就是密码哈希的问题,回到第一步重新处理密码。
5. 确认Lexik JWT密钥已生成
虽然你的错误是凭证无效,但如果密钥没生成,后续拿到token也没法验证,先确认这个步骤没遗漏:
php bin/console lexik:jwt:generate-keypair
执行后会在config/jwt目录下生成公私钥,同时检查config/packages/lexik_jwt_authentication.yaml的配置是否正确指向这些密钥。
按照上面的步骤排查,应该能解决问题。我当时就是因为手动存了明文密码,折腾了半天😂
内容的提问来源于stack exchange,提问作者nuk maccon
相关产品推荐
相关产品推荐

