在JIRA REST API中启用CORS

Ism*_*mic 9 javascript cors jira-rest-api

我在Confluence用户宏中从JavaScript调用JIRA REST API,我面临CORS问题,因为JIRA和Confluence位于两个不同的域上,浏览器的预检请求失败.我已经尝试了几种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
        })
Run Code Online (Sandbox Code Playgroud)

错误消息(来自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.
Run Code Online (Sandbox Code Playgroud)

JIRA配置

  • JIRA版本:6.4.12
  • 网址: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添加到白名单:是的

汇流配置

使用浏览器测试:

  • 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
Run Code Online (Sandbox Code Playgroud)

这似乎是积极的回应.

使用Crome扩展测试预检请求(OPTIONS)Postman:

OPTIONS http://jira.mydomain.com/rest/api/latest/search/?jql=issue%20in%20linkedIssues(SR-45)
Run Code Online (Sandbox Code Playgroud)

回复错误: Could not get any response. This seems to be like an error connecting to http://jira.mydomain.com/rest/api/latest/search/?issue%20in%20linkedIssues(SR-45)

jan*_*nis 2

回答这个问题有点晚了,但我会把它留在这里供参考。

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

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

吉拉代理

另一个不错的端点是/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 的源代码以获取更多信息,因为我还没有找到任何相关的在线文档。

使用此 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 请求以 401 错误结束

不过,这种方法需要通过应用程序链接连接 JIRA 和 Confluence 实例。但我假设您在调查更改源策略时拥有 JIRA 和 Confluence 的管理员访问权限,因此它不应该成为您的障碍。