Javascript Flask JWT扩展集cookie错误
我已经创建了一个API,它应该能够同时响应移动设备和web浏览器。例如,Javascript Flask JWT扩展集cookie错误,javascript,python,flask,flask-jwt,Javascript,Python,Flask,Flask Jwt,我已经创建了一个API,它应该能够同时响应移动设备和web浏览器。例如,/web/toys用于web,而/API/toys用于JSON响应。我使用JW令牌作为身份验证的手段 我用HTML显示表单,在后台,我调用jQueryAjax的方法发布到我的API。我将访问令牌保留在会话cookie中。为了防止CSRF攻击,我使用Flask JWT Extended 当我用@jwt_required装饰视图并且CSRF设置为True时,即使在设置和传输cookie时,标题和cookie中也会出现缺少jwt的
/web/toys
用于web,而/API/toys
用于JSON响应。我使用JW令牌作为身份验证的手段我用HTML显示表单,在后台,我调用jQueryAjax的方法发布到我的API。我将访问令牌保留在会话cookie中。为了防止CSRF攻击,我使用Flask JWT Extended
当我用
@jwt_required
装饰视图并且CSRF设置为True时,即使在设置和传输cookie时,标题和cookie中也会出现缺少jwt的情况。我检查了源代码,发现在请求头中设置X-CSRF-TOKEN
很重要
但是,由于端点同时响应GET和POST调用,我如何在GET调用中设置标题,而不必使用jQuery加载整个页面?
基本上,我希望在网页上显示表单,当用户单击submit时,使用jQuery将表单传输到现有API<如果有更好的方法处理事情,我很想知道。
谢谢 烧瓶JWT的作者在此扩展。正如您所发现的,通过此扩展,我们目前正在为每种类型的请求执行CSRF保护。但是,只有在状态更改请求时才真正需要CSRF保护:请参阅:
保护所有请求类型的好处是,如果您有一个端点错误地更改了GET请求中的状态(没有技术原因不能这样做),那么它就容易受到CSRF攻击。现在,如果后端的设计更“符合规范”,这就不再是一个问题。听起来我需要更新Flask JWT Extended,以便在某些类型的请求上忽略CSRF保护,就像Flask WTF的操作方式一样。今天我将尝试更新此内容
或者,如果您的后端直接提供JSON而不是html(例如RESTAPI后端和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令牌不存在,并且您正在使用JWTs的头和cookie,我还希望保留CSRF错误消息。这两方面的进展可在此处跟踪:
您可以发布html表单代码吗?该功能已在1.3.0版中发布。默认情况下,它现在只检查PUT、PATCH、POST和DELETE请求的CSRF保护。您可以通过“JWT\U CSRF\U方法”配置选项更新此列表。非常感谢您!我可以使用Flask的MethodView并在后期定义上应用装饰器吗?我的直觉是,您仍然需要在实际的视图函数本身上应用装饰器。这就是说,如果您有一个接受多个方法(方法=['GET','POST'])的视图函数,您仍然可以安全地将jwt_所需的装饰器添加到该视图中,并且它只会检查发送到该视图的POST请求的CSRF。