Quarkus部署到AWS Elastic Beanstalk后JWT鉴权接口返回401未授权
问题根因定位及解决方案
这个问题核心是Elastic Beanstalk部署环境下JWT公钥加载/解析异常导致的签名校验失败,本地正常、线上失败的常见原因集中在配置传递、文件格式处理环节,按以下步骤排查即可解决:
1. 第一优先级:验证线上环境实际加载的公钥内容
绝大多数此类问题都是CICD或者S3同步环节公钥文件被篡改/替换导致的:
- 先在EB环境的应用容器内打印实际加载的公钥字符串,和本地验证用的公钥做逐字符对比
可以临时加一段调试代码,启动时打印mp.jwt.verify.publickey配置值,或者直接读公钥文件的内容输出到日志 - 重点检查两个常见错误:
- CICD脚本里处理base64编码的公钥时,多了/丢了换行符、前后空格、末尾的
=填充符被截断 - S3同步时自动做了文本转码,把PEM格式公钥的换行符替换成了空格
- CICD脚本里处理base64编码的公钥时,多了/丢了换行符、前后空格、末尾的
2. 检查Quarkus JWT配置项的正确性
确认线上环境的配置没有被Beanstalk的环境变量覆盖:
- 如果你是用文件加载公钥,确认配置项
mp.jwt.verify.publickey.location指向的路径在EB容器内是真实存在的,并且应用进程有读取权限 - 如果你是直接把公钥内容写在配置里,确认
mp.jwt.verify.publickey的内容没有被YAML转义处理破坏,带换行的PEM格式公钥在YAML里必须用|块标量保留换行:
mp: jwt: verify: publickey: | -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... ... -----END PUBLIC KEY----- issuer: "https://10four.co.za/issuer"
- 必须确认
mp.jwt.verify.issuer配置值和你JWT里的iss字段完全一致,注意结尾的斜杠、大小写都不能错
3. 排查EB反向代理的Header处理问题
返回的响应头里有nginx标识,说明EB的前置nginx可能修改了请求的Authorization头:
- 确认nginx配置没有截断、修改Authorization头,部分默认配置会把没有显式允许的Header丢弃,你可以在应用接口里加个调试接口,打印收到的
Authorization请求头的值,确认和客户端发送的完全一致 - 注意Bearer前缀后面的空格不能多不能少,也不能被转义
按上述步骤排查下来基本可以定位问题,同类高频问题场景是CICD同步S3时自动把公钥文件的换行符转换成了空格,导致Quarkus解析公钥失败,签名校验自然通不过。
内容的提问来源于stack exchange,提问作者Rene Nochebuena
相关产品推荐
相关产品推荐

