【发布时间】:2014-09-09 18:14:39
【问题描述】:
我正在尝试使用 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 包装器不会发送访问控制标头?
两个包装器的源代码:
flask-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
【问题讨论】:
-
苦苦挣扎了好几个小时,终于找到了问题所在。希望它可以帮助遇到同样问题的其他人。如果需要身份验证,只需将“授权”添加到
Access-Control-Allow-Headers。像这样``` @app.route('/protected/place') @cross_origin(headers=['Content-Type','Authorization']) # 发送 Access-Control-Allow-Headers @jwt_required() def my_view_func(): do something ``` -
你知道如何将 CORS 添加到
/auth处理程序吗? -
@YangHu 感谢发帖,非常有帮助,实际上让我改变了我使用 CORS 扩展的方式。我发现你可以做同样的事情,除了全局(而不是在每个视图函数上使用装饰器)通过
CORS(app, origins="http://127.0.0.1:8080", allow_headers=["Content-Type", "Authorization", "Access-Control-Allow-Credentials"], supports_credentials=True)。 @Nikolay Fominyh 如果不使用扩展,您可以将装饰器堆叠在如下视图上:@app.route('someurl/') @cross_origin(your config in here) @auth.login_required def some_view():...
标签: python authentication flask cross-domain