【发布时间】: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