Spring RestTemplate调用Jira接口报401未授权错误问题咨询
核心错误定位
你的代码里构造HTTP Basic认证头的格式不符合规范,Basic 关键字和Base64编码后的凭据之间缺少必填的半角空格,这是直接触发401未授权错误的原因。
你当前的代码:
headers.add("Authorization", "Basic" + base64Creds);
实际发出的请求头格式为 Authorization: Basicabcdef12345xxx,服务端无法识别合法的Basic认证凭据,直接返回401。
正确写法需要在Basic后加空格:
headers.add("Authorization", "Basic " + base64Creds);
修复后仍报错的排查顺序
- 凭据类型校验:如果对接的是Jira Cloud版本,不支持直接用账号登录密码做Basic认证,需要用账号绑定的邮箱 + 个人生成的API Token作为凭据;如果是自建Jira Server/DC版本,先确认管理员未关闭接口的Basic认证权限,且所用账号未被锁定、拥有优先级接口的访问权限
- 编码问题修正:你当前调用
plainCreds.getBytes()时未指定字符集,会默认读取运行环境的默认编码,若用户名/密码包含非ASCII字符会出现编码偏差,统一指定UTF-8即可:byte[] base64CredsBytes = Base64.getEncoder().encode(plainCreds.getBytes(StandardCharsets.UTF_8)); - 接口路径校验:确认拼接后的最终请求路径符合Jira API规范,比如Jira Server端获取优先级列表的标准路径为
/rest/api/2/priority,注意jiraBaseURL结尾的斜杠不要重复拼接导致路径错误。可以先用Postman等工具手动携带凭据调用接口,确认凭据、路径本身可用,再和代码生成的请求逐字符对比 - 请求头校验:不要依赖
System.out.println打印的HttpHeaders对象判断实际发出的头内容,建议开启RestTemplate的debug日志查看实际发出的原始请求,确认Authorization头格式正确
修正后的完整认证工具类代码
@Component public class JiraHttpHeadersHelper { @Value("${first.jira.auth.user}") private String firstJiraAuthUser; @Value("${first.jira.auth.psw}") private String firstJiraAuthPsw; public HttpHeaders jiraHeadersWithAuthentication() { String plainCreds = firstJiraAuthUser + ":" + firstJiraAuthPsw; byte[] base64CredsBytes = Base64.getEncoder().encode(plainCreds.getBytes(StandardCharsets.UTF_8)); String base64Creds = new String(base64CredsBytes, StandardCharsets.UTF_8); HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Basic " + base64Creds); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }
绝大多数情况下补上Basic后的空格就能解决问题,修改后可以先断点查看生成的Authorization头值,确认
Basic和后面的Base64串之间有且仅有一个半角空格。
内容的提问来源于stack exchange,提问作者MayEncoding
相关产品推荐
相关产品推荐

