应用 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”错误

将 jwt auth/refresh 令牌与反应应用程序集成的好方法?

带有 JWT auth 和 csrf 令牌的 Spring Boot STATELESS 应用程序