跨域调用Web服务登录提交数据遇401错误求助
解决Jira API调用401未授权问题
嘿,你碰到的401错误大概率是认证方式不对加上调用了错误的API端点导致的,我给你拆解下问题和修复方案:
核心问题分析
- 调用了错误的URL:你收到的错误里请求的是
https://ss.atlassian.net/secure/MyJiraHome.jspa,这是Jira的网页界面地址,不是API接口!Jira的REST API端点应该是类似https://ss.atlassian.net/rest/api/2/issue这类格式,直接POST到网页地址肯定会触发未授权,因为它需要用户会话而不是API认证。 - 认证头未正确设置:你的代码里只定义了用户名和密码,但没有把它们转换成Jira要求的Basic认证格式,浏览器的
XMLHttpRequest不会自动帮你处理这个。 - 跨域(CORS)潜在问题:因为是跨域请求,即使认证正确,浏览器可能会因为CORS限制拦截请求,这个我们后面也会提到。
具体修复步骤
1. 修正API端点
先确认你要调用的Jira API正确地址,比如如果是更新issue字段,应该用:
https://ss.atlassian.net/rest/api/2/issue/{issueKey}
(把{issueKey}替换成实际的issue编号,比如TEST-123)
2. 添加正确的Basic认证头
Jira支持Basic认证,需要把用户名:密码用Base64编码后放在Authorization请求头里。修改你的代码:
function send() { const username = "j.er"; const password = "Sa@"; // 编码用户名密码 const authHeader = "Basic " + btoa(`${username}:${password}`); const url = "https://ss.atlassian.net/rest/api/2/issue/TEST-123"; // 替换成你的实际API地址 const itemJSON = { "fields": { "customfield_10053": { "value": "800" } } }; const xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { console.log("请求成功:", this.responseText); } else if (this.readyState === 4) { console.error("请求失败,状态码:", this.status); } }; xmlhttp.open("PUT", url, true); // 更新issue用PUT,创建用POST // 设置必要的请求头 xmlhttp.setRequestHeader("Authorization", authHeader); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.send(JSON.stringify(itemJSON)); }
注意:如果是创建新issue,要用
POST方法,地址是/rest/api/2/issue,请求体格式也会略有不同。
3. 处理跨域(CORS)问题
因为你是在浏览器端跨域调用Jira API,需要确保:
- Jira实例已经配置了CORS允许你的域名访问(可以联系Jira管理员在后台设置)
- 如果无法修改Jira的CORS配置,建议用后端代理:让你的后端服务器去调用Jira API,前端只和自己的后端通信,这样就能绕过浏览器的CORS限制,同时也能避免在前端硬编码密码(非常重要,前端硬编码密码会导致安全泄露!)
4. 额外注意事项
- 确认你的Jira账号有足够的权限操作目标issue(比如编辑字段的权限)
- 检查密码是否正确,尤其是特殊字符有没有转义问题
- 绝对不要在前端代码里硬编码敏感信息(用户名、密码),这是严重的安全隐患
内容的提问来源于stack exchange,提问作者aayushi rathore
相关产品推荐
相关产品推荐

