应用JWT认证时Flask-cors包装器无效。

9 投票
1 回答
4884 浏览
提问于 2025-04-18 13:51

我正在用Flask搭建一个API网站,并且使用Flask-jwt来提供令牌授权。
如果我在Apache中进行CORS设置(使用mod_headers添加允许访问的头部,比如这样),授权是可以正常工作的:

Header set Access-Control-Allow-Origin "*"

不过,我想要更详细的访问控制,而不仅仅是使用通配符。我查看了flask-cors,这是一个很好的工具,可以检查来源并发送相应的头部。现在我的路由看起来是这样的(而且在Apache设置中不需要做头部的处理):

@app.route('/protected/place')
@cross_origin(headers=['Content-Type']) # Send Access-Control-Allow-Headers
@jwt_required()
def my_view_func():
    do something

但是现在,如果我从JavaScript发起HTTP请求,服务器不会返回Access-Control的头部。(不过,如果我手动发送请求,比如用curl,我仍然可以看到跨域插件在工作,并且有Access-Control的头部)

当我去掉@jwt_required这个装饰器时,cross_origin装饰器工作得很好,会给我返回响应。
但是一旦加上jwt_required装饰器,服务器就没有响应了。

我正在用Chrome调试我的客户端页面。顺便提一下。

我尝试过改变装饰器的顺序,但没有帮助。

是否有可能在身份验证失败时,cross_origin装饰器不会发送Access-Control的头部?

这两个装饰器的源代码:
flask-jwt:
https://github.com/mattupstate/flask-jwt/blob/master/flask_jwt/init.py
flask-cors:
https://github.com/wcdolphin/flask-cors/blob/master/flask_cors.py

1 个回答

8

经过很多小时的努力,我终于找到了问题所在。希望这能帮助到遇到同样问题的其他人。
当需要进行身份验证时,只需在“headers”参数中包含 Authorization(这会设置 Access-Control-Allow-Headers 字段)。
像这样

@app.route('/protected/place') 
@cross_origin(headers=['Content-Type','Authorization']) # Send Access-Control-Allow-Headers 
@jwt_required() 
def my_view_func(): 
    do something

撰写回答