在JIRA REST API中启用CORS

9
我正在一个Confluence用户宏中使用JavaScript调用JIRA REST API,但由于JIRA和Confluence位于两个不同的域上,并且浏览器的预检请求失败,所以我面临着CORS问题。我已经尝试了下面描述的几种CORS解决方案,但都没有成功。因此,我恳求其他人提供一些解决此问题的建议。 失败的JavaScript片段:
AJS.$.ajax({
            type: "GET",
            url: "http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45)",
            dataType: "json",
            contentType: "application/json",
            async: false
        })

错误信息(来自Firefox):
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45). This can be fixed by moving the resource to the same domain or enabling CORS.

JIRA配置
- JIRA版本:6.4.12 - Url:http://jira.mydomain.com - 前置Apache运行(代理):是
响应头配置:
- Access-Control-Allow-Headers: origin,content-type,accept - Access-Control-Allow-Methods: POST,GET,OPTIONS - Access-Control-Allow-Origin: *
- Confluence添加到白名单:是
表达式:Confluence (http://confluence.mydomain.com) 类型:应用程序链接 允许传入:是
Confluence配置
汇合版本:5.8.8 网址:http://confluence.mydomain.com 前置运行Apache(代理):是的
响应标头配置:
Access-Control-Allow-Origin:*
JIRA添加到白名单:是的
表达式:Confluence (http://jira.mydomain.com) 类型:应用链接 允许传入:真的
使用浏览器测试:
Chrome(最新) Safari(最新) Firefox(最新)
使用CURL测试预检请求(OPTIONS):
ismar.slomic$ curl -X OPTIONS "http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45)" -v
*   Trying 10.107.1.24...
* Connected to jira.mydomain.com (127.0.0.1) port 80 (#0)
> OPTIONS /rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45) HTTP/1.1
> Host: jira.mydomain.com
> User-Agent: curl/7.43.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host jira.mydomain.com left intact
curl: (52) Empty reply from server

这似乎是积极的回应。
使用Chrome扩展程序Postman测试预检请求(OPTIONS):
OPTIONS http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45)

响应错误:无法获取任何响应。这似乎是连接到http://jira.mydomain.com/rest/api/latest/search/?issue%20in%20linkedIssues(SR-45)时出现的错误


你在Chrome上是否收到了与Firefox相同的错误信息? - rby
Chrome浏览器中的错误信息:NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues... - Ismar Slomic
看起来你的AJAX调用没有成功。也许你可以添加一个错误回调函数,查看你得到的状态码。此外,你正在指定数据类型为JSON,因此请确保确实发送了JSON数据。 - rby
rby: 在这种情况下没有要发送的JSON数据。错误回调会给出以下信息:statusText:“NetworkError:在'XMLHttpRequest'上执行'send'失败:无法加载'http://jira.mydomain.com/rest/api/latest/search/?jql=key=issue in issueLinks(SR-55)”。” - Ismar Slomic
在使用Postman或Chrome控制台测试预检请求时,没有任何响应(无论是头部还是正文)。我只收到一个错误,即与服务器的连接已关闭。 - Ismar Slomic
显示剩余3条评论
1个回答

2

我回答有点晚了,但我会在这里留下参考资料。

在我的宏中,我采用了另一种方法来解决这个问题。我没有直接向JIRA服务器发送请求,而是使用Confluence服务器公开的API将我的JIRA请求代理到链接的JIRA实例。

我在另一个答案中描述了这个端点。使用这种方法,您不会违反跨域策略。事实上,这就是JIRA IssuesJIRA Chart宏用于呈现其小部件的方法。引用:

JIRA代理

另一个好的端点是/plugins/servlet/applinks/proxy。它允许将简单的REST请求转发到链接的JIRA实例。例如,/plugins/servlet/applinks/proxy?appId={INSERT APPLINK ID HERE}&path=%2Frest%2Fapi%2F2%2Fsearch将调用JIRA的问题搜索REST端点,并列出用户可以访问的问题(如在JIRA搜索中)。所谓“简单请求”是指当前版本仅支持GET和POST HTTP方法(其中POST限于application/xmlmultipart/form-data内容类型)。该servlet支持查询字符串和HTTP头参数。查看插件源代码库中的servlet源代码链接以获取更多信息,因为我没有找到任何在线文档。

通过请求/plugins/servlet/applinks/proxy?appId={INSERT APPLINK ID HERE}&path=%2Frest%2Fapi%2F2%2Fproject,您也可以获得项目列表。

存储库中servlet的路径是confluence-jira-plugin/src/main/java/com/atlassian/confluence/plugins/jira/AppLinksProxyRequestServlet.java,但大部分重要的内容都在其基类confluence-jira-plugin/src/main/java/com/atlassian/confluence/plugins/jira/AbstractProxyServlet.java中。

-- confluence REST API request while not being admin ends in 401 error

这种方法需要通过应用链接将JIRA和Confluence连接在一起。不过,我假设您具有对JIRA和Confluence的管理员访问权限,因为您正在调查更改源策略,所以这不应该阻止您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接