即使在Flask应用中启用了CORS,也无法设置Cookie

时间:2019-06-24 15:13:04

标签: ajax flask cookies cors

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

我的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下没有任何显示。

enter image description here

我尝试了多种方法:

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

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

1 个答案:

答案 0 :(得分:1)

因此,在经历了很多头痛之后,我发现了问题所在。部分原因是我的错,也是潜在的错误。

我正在使用import re string = '(((x12 & x20) & x05) | x02) | ((x12 & x13)) | (x13 | x20)' result = re.findall('\(([^\(].*?)\)', string) # --> ['x12 & x20', 'x12 & x13', 'x13 | x20'] print('({})'.format(result[0])) 库进行JWT身份验证;有一些关于JWT的环境变量,其值在flask-jwt-extended函数中使用。

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

这对于MY_VAR表现得特别差-该变量的值在JWT_COOKIE_SECURE函数中使用,该函数本身将set_access_cookies函数用于set_cookie对象-< strong>如果您在“安全”字段中传递字符串,则会使Cookie乱码,并且您的浏览器很可能会忽略它。

因此,乱码的cookie看起来像这样:

Request

请注意,('Set-Cookie', 'access_token_cookie=yourtoken; Domain=localhost.example.com; Secure; HttpOnly; Path=/') 字段应为空还是不存在(如果为false)时该字段为空。

我希望这会有所帮助!