Symfony6+Sonata环境下API接口401:JWT Token未找到问题
排查Symfony API Platform JWT认证"Token not found"问题
1. 核对security.yaml核心配置
重点检查以下关键部分:
- 防火墙规则:确保API端点所在防火墙开启无状态模式,并正确关联JWT认证器
security: firewalls: api: pattern: ^/api stateless: true entry_point: jwt authenticators: - lexik_jwt_authentication.jwt_authenticator # Sonata Admin的防火墙配置保持原有逻辑 admin: pattern: ^/admin # 你的Sonata认证相关配置 - 访问控制优先级:确保登录接口允许匿名访问,其他API需要认证,且规则顺序正确(Symfony匹配第一个符合条件的规则)
access_control: - { path: ^/api/app_users/auth, roles: PUBLIC_ACCESS } # 登录接口放开 - { path: ^/api, roles: IS_AUTHENTICATED_FULLY } # 其余API需认证 - 用户提供者配置:确认关联了正确的用户实体,避免认证时无法找到用户
providers: app_user_provider: entity: class: App\Entity\AppUser property: email
2. 验证请求头的准确性
- 确认请求头格式为
Authorization: Bearer <令牌内容>,注意Bearer后必须有一个空格,无多余空格或换行 - curl测试命令示例:
curl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." https://你的域名/api/目标端点 - 查看
var/log/dev.log,搜索Authorization关键字,确认请求头未被服务器或代理拦截
3. 确认路由匹配逻辑
运行php bin/console debug:router,检查目标API端点的路由前缀是否匹配api防火墙的pattern(如^/api),避免请求误匹配到其他防火墙(如Admin防火墙)
4. 调试JWT认证流程
- 开启Symfony开发环境调试模式,查看完整的错误堆栈跟踪,确认JWT认证器是否被触发
- 可在
lexik_jwt_authentication.jwt_authenticator的getCredentials方法中添加日志或Xdebug断点,验证是否接收到Authorization头
5. 检查Token有效性
- 通过jwt.io验证Token的
exp(过期时间)、sub(用户ID)、roles字段是否正确 - 核对
lexik_jwt_authentication.yaml中的token_ttl配置,确认Token未过期
内容的提问来源于stack exchange,提问作者Nicolas FRUGIER
相关产品推荐
相关产品推荐

