【问题标题】:Cookies not being set even with CORS enabled in Flask app即使在 Flask 应用程序中启用了 CORS,也没有设置 Cookie
【发布时间】:2020-03-14 08:54:37
【问题描述】:

请注意:有很多这样的问题,但没有一个对我有用,这就是我问这个的原因。

我的 REST API 是一个 Flask 应用程序。我的 /login 端点使用 JWT 并在客户端的 cookie 中设置访问和刷新令牌。

我在 127.0.0.1:5000 上运行 Flask,在 127.0.0.1:8080 上运行前端。

后端代码

@auth.api(
    http_path='/login',
    http_method='POST',
)
def login(email, password):
    # ...
    access_token = create_access_token(identity=user.id, fresh=True, expires_delta=app.config['JWT_ACCESS_TOKEN_EXP'])
    refresh_token = create_refresh_token(identity=user.id, expires_delta=app.config['JWT_REFRESH_TOKEN_EXP'])

    resp = jsonify({'login': True})
    set_access_cookies(resp, access_token)
    set_refresh_cookies(resp, refresh_token)
    # ...
    return resp

我的应用启用了 CORS:

from flask_cors import CORS
# ...
cors = CORS()

def create_app():
    app = Flask(__name__)
    # ...
    cors.init_app(app)
    # ...
    return app

客户代码

$.ajax({
    method: "POST",
    url: "http://127.0.0.1:5000/login",
    data: JSON.stringify({email: 'myemail', password: 'mypassword'}),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (data) {
        console.log('logged in!');
    }
});

问题

没有在 Firefox、Chrome 或 Edge 中设置 cookie。但是,当使用浏览器的开发工具时,我可以在响应标头中看到 cookie,但在 Cookies 下的存储部分中没有显示任何内容。

我尝试了多种方法:

  • 在后端设置cors=CORS(supports_credentials=True),在前端设置xhrFields:{ withCredentials: true}
  • 在前端设置crossDomain: true
  • 确保没有 cookie 被浏览器设置阻止
  • 专门在127.0.0.1 而不是localhost 上运行

前端需要某种代理吗?必须有一个更简单的解决方案。

【问题讨论】:

    标签: ajax flask cookies cross-domain


    【解决方案1】:

    所以在经历了很多头痛之后,我发现出了什么问题。这部分是我的错,但也是一个潜在的错误。

    我正在使用 flask-jwt-extended 库进行 JWT 身份验证;有一些关于 JWT 的环境变量,其值在 set_access_cookies 函数中使用。

    通常,您的 Flask 应用程序配置是这些变量的位置,然而,我选择使用单独的 .env 文件并从中加载我的环境变量。问题在于,对于MY_VAR=FalseMY_VAR 之类的东西,会得到 字符串值“False”,而不是布尔标志。

    这对JWT_COOKIE_SECURE 表现得特别差 - 此变量的值用于set_access_cookies 函数,该函数本身使用set_cookie 函数作为Request 对象 - 如果你传递一个字符串Secure 字段,它会使 cookie 出现乱码,您的浏览器很可能会忽略它。

    所以一个乱码 cookie 看起来像这样:

    ('Set-Cookie', 'access_token_cookie=yourtoken; Domain=localhost.example.com; Secure; HttpOnly; Path=/')
    

    注意Secure 字段是空的,它应该是布尔值或者根本不存在(如果为假)。

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2015-05-05
      • 2019-04-19
      • 2015-02-25
      • 2017-03-21
      相关资源
      最近更新 更多