Flask JWT 扩展设置 cookie 错误

Flask JWT Extended set cookie error

我创建了一个 API,它应该对移动设备和 Web 浏览器都有响应。例如,/web/toys 用于网络,/API/toys 用于 JSON 响应。我使用 JW 令牌作为身份验证方式。
我在 HTML 中显示表单,在后台,我将 jQuery Ajax 的方法调用到 POST 到我的 API。我将 access_tokens 保存在 session cookie 中。为了防止 CSRF 攻击,我使用 Flask-JWT-Extended。

当我使用 @jwt_required 修饰视图并且 CSRF 设置为 True 时,我得到 missing JWT in headers and cookies,即使正在设置和传输 cookie。查看了源码,发现在请求header中设置X-CSRF-TOKEN很重要。
但是,由于端点响应 GET 和 POST 调用,我如何在 GET 调用中设置 header 而不诉诸于使用 jQuery 加载完整页面.?
基本上,我想在网页上显示表单,当用户点击提交时,使用 jQuery 将表单转移到现有的 API。
如果有更好的处理方式,我很想知道。
谢谢!

Flask-JWT-Extended 的作者在这里。正如您所发现的,通过此扩展,我们目前正在为每种类型的请求提供 CSRF 保护。但是,只有在状态更改请求时才真正需要 CSRF 保护:参见:https://security.stackexchange.com/questions/115794/should-i-use-csrf-protection-for-get-requests/115800

保护所有请求类型的好处是,如果您的端点错误地更改了 GET 请求中的状态(没有技术原因不会发生这种情况),它就会容易受到 CSRF 攻击。现在如果后端设计多'up to spec',这就不是问题了。听起来我需要更新 Flask-JWT-Extended 以允许忽略某些类型请求的 CSRF 保护,就像 Flask-WTF 的操作方式一样。我会尽量在今天更新。

或者,如果您的后端直接服务于 JSON 而不是 html(例如 REST api 后端和 javascript 前端),您可以使用 Ajax 使用 CSRF 令牌执行 GET 请求。在这个用例中,我们可以按照这些行使用 Ajax 调用。

   get (options) {
     let self = this
     $.ajax({
       method: 'GET',
       dataType: 'json',
       headers: {
         'X-CSRF-TOKEN': Cookies.get('csrf_access_token')
       },
       url: "some_url",
       success (result, statusText) {
         // Handle success
       },
       error (jqXHR, textStatus, errorThrown) {
         //handle error
       }
     })
   }

编辑:如果 CSRF 令牌不存在并且您同时使用 headers 和 JWT cookie,我还想保留 CSRF 错误消息。可以在此处跟踪这两项的进展: