应用 jwt auth 包装器时,Flask-cors 包装器不起作用。
Posted
技术标签:
【中文标题】应用 jwt auth 包装器时,Flask-cors 包装器不起作用。【英文标题】:Flask-cors wrapper not working when jwt auth wrapper is applied. 【发布时间】: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():...
【参考方案1】:
苦苦挣扎了好几个小时,终于找到了问题所在。希望它可以帮助遇到同样问题的其他人。
只需在需要身份验证时在“headers”参数(设置Access-Control-Allow-Headers
字段)中包含Authorization
。
像这样
@app.route('/protected/place')
@cross_origin(headers=['Content-Type','Authorization']) # Send Access-Control-Allow-Headers
@jwt_required()
def my_view_func():
do something
【讨论】:
很高兴看到您找到了解决方案,抱歉花了这么长时间,而且还没有达到应有的清晰程度。我将添加一些 GOTCHA 并确保清楚可能需要授权标头。可悲的是,允许它们不是安全的默认设置(因为它可能会引发潜在的偷渡攻击)以上是关于应用 jwt auth 包装器时,Flask-cors 包装器不起作用。的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails + React 应用程序中 JWT 用于 Auth 有啥用
Auth0 NodeJS JWT 身份验证在移动应用程序的 API 中
如何使用 jwt-auth 在 Laravel 中正确设置 JWT 机密?
Laravel/jwt-auth 和 Angular/Satellizer 应用程序出现随机 400“token_invalid”错误