在 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/xml
和multipart/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的主要内容,如果未能解决你的问题,请参考以下文章
为 API Gateway REST API 资源启用 CORS
如何在我的 Django REST api 上调试启用 CORS