【发布时间】:2018-03-18 20:42:18
【问题描述】:
我有一个项目,其中 Play Framework 应用用作 Chrome 扩展的 API 后端。由于我没有为 Play Framework 项目指定任何过滤器,它默认启用 CSRF 保护(通过 CSRFFilter),这可能适合我的情况,也可能不适合我的情况。
在 Chrome 扩展程序中,我首先进行 jQuery AJAX 调用以登录,以便 Play Framework 服务器设置用户令牌 cookie(将用于在所有后续 API 调用中识别用户):
$.ajax({
method: 'POST',
url: serverUrl + "api/google_sign_in",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ google_id_token: token }),
success: function (response) {
onSuccess();
},
error: function (req, status, error) {
onError(error);
}
});
调用成功,用户令牌设置为 cookie。到目前为止,一切都很好。但是,一旦我尝试使用类似的 jQuery AJAX 调用进行任何其他 API 调用,Play Framework 就会抱怨缺少 CSRF 令牌,大概是因为现在有一个 cookie 集需要保护:
[CSRF] Check failed because no token found in headers for /api/get_status
然后调用失败。从我对 CSRF 保护的非常有限的理解来看,服务器应该在某些时候在某些生成的 HTML 中包含 CSRF 令牌?但在这种情况下,只有返回 JSON 的纯 API 调用。我是否希望在从服务器返回的 JSON 中明确指定 CSRF 令牌,然后手动将其作为标头包含在 Javascript 端的后续 AJAX 调用中?
另外,这种类型的 API 后端是否需要 CSRF 保护?或者我可以完全禁用它吗?
谢谢,尼尔
【问题讨论】:
标签: jquery ajax google-chrome-extension playframework csrf-protection