Quarkus如何同时通过Authorization头和Cookie实现JWT身份认证?
问题根因
你配置出错的核心原因是错误覆盖了mp.jwt.token.header参数,该参数用于指定读取JWT的请求头名称,默认值为Authorization(供REST接口传递Bearer {token}使用),你将其改为Cookie后,框架会直接读取整个Cookie请求头的完整内容作为JWT解析,自然会抛出格式错误,你看到的异常就是因为整个Cookie字符串不符合JWT的分段格式要求。
可行解决方案
SmallRye JWT原生支持同时从Authorization头和指定Cookie读取JWT,无需拆分应用,也不需要全量使用JS实现UI,正确配置如下:
mp: jwt: token: # 保留默认的Authorization头,无需修改,供REST接口使用 cookie: jwt # 仅需配置该参数,指定读取JWT的Cookie名称为jwt # 移除smallrye.jwt.always-check-authorization配置,默认逻辑已支持两种读取方式的自动 fallback
配置生效后,框架的校验逻辑为:
- 优先检查请求的
Authorization头是否携带Bearer格式的JWT,存在则用该令牌校验 - 若Authorization头无有效JWT,自动读取名称为
jwt的Cookie值作为JWT校验 - 两者都不存在时,若端点无
@PermitAll注解才会抛出鉴权失败异常
Cookie读取失败排查点
如果配置后仍无法从Cookie读取JWT,按以下顺序排查:
- 确认JWT Cookie的
Path属性配置为/,确保所有路径的端点都能读取到Cookie - 若站点使用HTTPS,需给Cookie加上
Secure属性 - 生成Cookie时注意不要添加多余的前缀、后缀,值为纯JWT字符串即可
- 排查是否有反向代理、Nginx等中间件过滤或修改了Cookie内容
内容的提问来源于stack exchange,提问作者Snappawapa
相关产品推荐
相关产品推荐

