在 JIRA REST API 中启用 CORS

Posted

技术标签:

【中文标题】在 JIRA REST API 中启用 CORS【英文标题】:Enable CORS in JIRA REST API 【发布时间】:2016-02-17 23:57:28 【问题描述】:

我在 Confluence 用户宏中从 javascript 调用 JIRA REST API,我遇到了 CORS 问题,因为 JIRA 和 Confluence 位于两个不同的域中,并且来自浏览器的 preflight request 失败。我已经尝试了如下所述的几种 CORS 解决方案,但均未成功。所以我恳求其他人提供一些可能已经解决了这个问题的意见。

JavaScript sn-p 失败

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 网址: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 添加到whitelist:是 表达式:Confluence (http://confluence.mydomain.com) 类型:应用链接 允许传入:True

Confluence 配置

Confluence 版本:5.8.8 网址:http://confluence.mydomain.com 在前面运行 Apache(代理):是 响应标头配置: Access-Control-Allow-Origin:* JIRA 添加到whitelist:是 表达式:Confluence (http://jira.mydomain.com) 类型:应用链接 允许传入:True

用浏览器测试:

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

这似乎是积极的回应。

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

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

响应错误: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)

【问题讨论】:

在 Chrome 上收到与 Firefox 相同的错误消息吗? Chrome 中的错误消息:NetworkError:无法在“XMLHttpRequest”上执行“发送”:无法加载“jira.mydomain.com/rest/api/latest/search/…... 您的 ajax 调用似乎没有通过。也许您可以添加一个错误回调并查看您获得的状态。此外,您将 json 指定为 dataType,因此请确保您确实在发送 json 数据。 在域上启动一个简单的直通服务。我以前必须这样做,在这种情况下使用了 Node。在 confluence/Jira 上向它发送一个带有你想要查询的 URL 的有效负载,然后返回它发送的响应。 rby:在这种情况下没有要发送的 json 数据。错误回调给出以下内容:statusText:“NetworkError:无法在'XMLHttpRequest'上执行'send':无法在issueLinks(SR-55)中加载'jira.mydomain.com/rest/api/latest/search/?jql=key=issue” 【参考方案1】:

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

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

我在another answer 中描述了这个端点。使用这种方法,您不会破坏跨域策略。事实上,这就是 JIRA Issues 和 JIRA Chart 宏用来渲染它们的小部件的。引用:

JIRA 代理

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

使用此 servlet,您还可以通过请求 /plugins/servlet/applinks/proxy?appId=INSERT APPLINK ID HERE&path=%2Frest%2Fapi%2F2%2Fproject 来获取项目列表

Servlets 在 repo 中的路径是 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

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

【讨论】:

以上是关于在 JIRA REST API 中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

为 REST API 启用 CORS 支持

为 API Gateway REST API 资源启用 CORS

如何在我的 Django REST api 上调试启用 CORS

为 Cowboy REST API 启用 CORS

无法在 Spring Boot Data Rest 中启用 CORS

启用 Cors 服务的 ionic post in rest 服务错误