将 POST 发送到自定义休息端点时 XSRF 检查失败
XSRF check failed when sending POST to custom rest endpoint
我有一个显示表单对话框的 ScriptRunner 片段。这是代码:
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
@BaseScript CustomEndpointDelegate delegate
showCloneEazyBIAccounts() { MultivaluedMap queryParams ->
def dialog =
"""<section role="dialog" id="sr-dialog" class="aui-layer aui-dialog2 aui-dialog2-medium" aria-hidden="true" data-aui-remove-on-hide="true">
<header class="aui-dialog2-header">
<h2 class="aui-dialog2-header-main">Clone EazyBI Accounts by Model</h2>
<a class="aui-dialog2-header-close">
<span class="aui-icon aui-icon-small aui-iconfont-close-dialog">Close</span>
</a>
</header>
<div class="aui-dialog2-content">
<form class="aui" action="/rest/scriptrunner/latest/custom/cloneJE2Cube" method="post">
<div class="field-group">
<label for="accountNames">Account Names <span class="aui-icon icon-required"></span></label>
<input class="text medium-field" type="text"id="accountNames" name="accountNames" placeholder="Cubo 1, Cubo 2...">
</div>
<div class="field-group">
<label for="projectKeys">Project Keys <span class="aui-icon icon-required"></span></label>
<input class="text medium-field" type="text"id="projectKeys" name="projectKeys" placeholder="JESC, JEBACK....">
</div>
<div class="field-group">
<label for="model">Model <span class="aui-icon icon-required"></span></label>
<select class="select" id="model" name="model">
<option>Select</option>
<option>JESC</option>
<option>JEBACK</option>
<option>COM</option>
<option>AGILE</option>
</select>
</div>
<div class="buttons-container">
<div class="buttons">
<input class="button submit" type="submit" value="Clone" id="clone-button">
</div>
</div>
</form>
</div>
<footer class="aui-dialog2-footer">
<div class="aui-dialog2-footer-hint"></div>
</footer>
</section>
"""
Response.ok().type(MediaType.TEXT_HTML).entity(dialog.toString()).build()
}
我需要这个表单来将数据发送到另一个自定义休息端点(当我从邮递员那里调用它时它工作正常),但是当我提交这个对话框时,它出现 "XSRF check failed".
有没有办法让它起作用?
此致,
埃洛伊
是因为你的浏览器添加了header,这种情况下我认为问题是User-Agentheader,如果它不能解决问题,请将其覆盖为虚拟的东西打开浏览器的网络工具并覆盖所有由浏览器添加的自定义 header。
最后我解决了使用 AJAX 发送请求并添加 headers: { 'X-Atlassian-Token': 'nocheck' }.
的问题
希望对您有所帮助!
在我们的案例中,有两种可能的解决方案。
更改用户代理 Header(据我所知 Chrome 不可能)
Whitelist/Allowlist Jira 中的源域。当您向 Jira API 发送请求时,您的浏览器会自动填充“来源”header。您需要将该值添加到 Jira 中的 whitelist/allowlist。 -> 看这里:
https://confluence.atlassian.com/adminjiraserver073/configuring-the-allowlist-1014667631.html
输入“域”应该可以。
查看 Atlassian 记录的问题:
https://confluence.atlassian.com/jirakb/rest-api-calls-with-a-browser-user-agent-header-may-fail-csrf-checks-802591455.html
我有一个显示表单对话框的 ScriptRunner 片段。这是代码:
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
@BaseScript CustomEndpointDelegate delegate
showCloneEazyBIAccounts() { MultivaluedMap queryParams ->
def dialog =
"""<section role="dialog" id="sr-dialog" class="aui-layer aui-dialog2 aui-dialog2-medium" aria-hidden="true" data-aui-remove-on-hide="true">
<header class="aui-dialog2-header">
<h2 class="aui-dialog2-header-main">Clone EazyBI Accounts by Model</h2>
<a class="aui-dialog2-header-close">
<span class="aui-icon aui-icon-small aui-iconfont-close-dialog">Close</span>
</a>
</header>
<div class="aui-dialog2-content">
<form class="aui" action="/rest/scriptrunner/latest/custom/cloneJE2Cube" method="post">
<div class="field-group">
<label for="accountNames">Account Names <span class="aui-icon icon-required"></span></label>
<input class="text medium-field" type="text"id="accountNames" name="accountNames" placeholder="Cubo 1, Cubo 2...">
</div>
<div class="field-group">
<label for="projectKeys">Project Keys <span class="aui-icon icon-required"></span></label>
<input class="text medium-field" type="text"id="projectKeys" name="projectKeys" placeholder="JESC, JEBACK....">
</div>
<div class="field-group">
<label for="model">Model <span class="aui-icon icon-required"></span></label>
<select class="select" id="model" name="model">
<option>Select</option>
<option>JESC</option>
<option>JEBACK</option>
<option>COM</option>
<option>AGILE</option>
</select>
</div>
<div class="buttons-container">
<div class="buttons">
<input class="button submit" type="submit" value="Clone" id="clone-button">
</div>
</div>
</form>
</div>
<footer class="aui-dialog2-footer">
<div class="aui-dialog2-footer-hint"></div>
</footer>
</section>
"""
Response.ok().type(MediaType.TEXT_HTML).entity(dialog.toString()).build()
}
我需要这个表单来将数据发送到另一个自定义休息端点(当我从邮递员那里调用它时它工作正常),但是当我提交这个对话框时,它出现 "XSRF check failed".
有没有办法让它起作用?
此致, 埃洛伊
是因为你的浏览器添加了header,这种情况下我认为问题是User-Agentheader,如果它不能解决问题,请将其覆盖为虚拟的东西打开浏览器的网络工具并覆盖所有由浏览器添加的自定义 header。
最后我解决了使用 AJAX 发送请求并添加 headers: { 'X-Atlassian-Token': 'nocheck' }.
的问题希望对您有所帮助!
在我们的案例中,有两种可能的解决方案。
更改用户代理 Header(据我所知 Chrome 不可能)
Whitelist/Allowlist Jira 中的源域。当您向 Jira API 发送请求时,您的浏览器会自动填充“来源”header。您需要将该值添加到 Jira 中的 whitelist/allowlist。 -> 看这里: https://confluence.atlassian.com/adminjiraserver073/configuring-the-allowlist-1014667631.html 输入“域”应该可以。
查看 Atlassian 记录的问题: https://confluence.atlassian.com/jirakb/rest-api-calls-with-a-browser-user-agent-header-may-fail-csrf-checks-802591455.html