我正在尝试使用Flask构建api站点,并且我使用Flask-jwt
来提供令牌授权。
如果我在Apache中执行CORS(使用mod_headers添加Allow-Access头,就像这样
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,我仍然可以看到交叉源插件工作和访问控制头)
当我删除@jwt_required
包装器时,cross_origin包装器运行正常,它会给我响应。
当应用jwt_required包装器时,无法从服务器看到响应。
我正在使用chrome调试我的客户端页面。顺便说一句
我试图改变包装器的顺序,但它没有帮助。
如果身份验证失败,cross_origin包装器是否可能不会发送访问控制标头?
两个包装器的源代码:
烧瓶-JWT:
https://github.com/mattupstate/flask-jwt/blob/master/flask_jwt/init.py
烧瓶-CORS:
https://github.com/wcdolphin/flask-cors/blob/master/flask_cors.py
答案 0 :(得分:5)
经过几个小时的挣扎,我终于找到了问题所在。希望它可以帮助那些解决同样问题的人
只需要将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