使用Basic Auth调用JIRA Cloud API失败,遭遇Access-Control-Allow-Origin错误
我想通过REST API获取JIRA Issue并编辑部分字段值,采用Basic Authorization认证方式。我参考了JIRA Cloud REST API v3入门、用户组管理、OAuth 2.0 3LO应用权限配置,以及Basic认证API Token获取相关文档,也已经获取了用于Basic认证的API Token。
我编写了以下前端代码:
<html> <head> </head> <body> <script> console.log("called function httpGetRequest"); let url = 'https://my-domain.atlassian.net/rest/api/3/issue/TEST-2'; let user = '<my email address>'; let password = '<basic api token>'; let pass_base64 = btoa(password); let auth_buff = user+":"+password; let auth = btoa(auth_buff); console.log ("auth : "+auth); var xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.withCredentials = true; xhr.setRequestHeader("Authorization", "Basic " + auth); xhr.setRequestHeader('Accept', 'application/json'); xhr.onreadystatechange = function () { console.log( 'Response: '+ xhr.status + ' - '+xhr.responseText); if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; </script> </body> </html>
但始终收到跨域错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://my-domain.atlassian.net/rest/api/3/issue/TEST-2. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
XHR GET https://my-domain.atlassian.net/rest/api/3/issue/TEST-2.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://my-domain.atlassian.net/rest/api/3/issue/TEST-2. . (Reason: CORS request did not succeed).
请问哪里操作出错了?
问题解答
这不是你的代码认证逻辑出错,而是JIRA Cloud API不允许浏览器端直接通过Basic Auth发起跨域请求——Atlassian没有为Basic Auth请求配置Access-Control-Allow-Origin响应头,浏览器的同源策略会直接拦截这类跨域请求。
解决方法有两种:
- 后端代理请求:在你的后端服务中封装JIRA API调用逻辑,由后端发起请求(后端不受浏览器同源策略限制),前端调用自己的后端接口间接获取或修改JIRA Issue。这种方式更安全,还能避免在前端暴露邮箱和API Token。
- 改用OAuth 2.0 3LO认证:如果必须在前端直接操作,使用Atlassian的OAuth 2.0 3LO授权流程。该流程通过授权码获取访问令牌,JIRA会为这类请求配置合法的CORS响应头,允许前端直接调用API。
内容的提问来源于stack exchange,提问作者paul mart

