Reactjs 无法使用Flask JWT Extended、React和Axios在Chrome中设置Cookie
背景和问题 我有一个Flask后端在localhost:5000上运行,还有一个React SPA在localhost:3000上运行。 我能够让他们说话,但当试图将Flask生成的令牌存储到浏览器的cookies中时1)在执行Reactjs 无法使用Flask JWT Extended、React和Axios在Chrome中设置Cookie,reactjs,flask,cookies,axios,cross-domain,Reactjs,Flask,Cookies,Axios,Cross Domain,背景和问题 我有一个Flask后端在localhost:5000上运行,还有一个React SPA在localhost:3000上运行。 我能够让他们说话,但当试图将Flask生成的令牌存储到浏览器的cookies中时1)在执行console.log(response)时,响应头不包含任何cookies,在从axios成功发布后2)cookies未被设置。但是当检查network>Login.js头时,我实际上可以看到Set Cookie键作为响应头存在。我已经尝试过谷歌和StackOverfl
console.log(response)
时,响应头不包含任何cookies,在从axios
成功发布后2)cookies未被设置。但是当检查network>Login.js头时,我实际上可以看到Set Cookie
键作为响应头存在。我已经尝试过谷歌和StackOverflow的多种解决方案,但这里似乎没有任何解决方案,我真的不知道是怎么回事,因为请求成功了,Chrome允许第三方软件设置cookies。甚至我也可以从Network>Login.js标题中看到令牌
步骤
1) 用户输入用户名和密码,然后点击登录
2) Axios POST呼叫是对Flask的后端进行的
3) 处理数据并生成两个令牌,并将它们设置为cookie
4) 浏览器的cookie设置了少量令牌 因此问题来自
localhost
我有一个Flask后端在localhost:5000上运行,还有一个React SPA在localhost:3000上运行
从上面的语句中,非常具体地说,我在localhost:5000上运行后端,在127.0.0.1:3000上运行React SPA
一旦我将127.0.0.1
更改为localhost
,它就像一个魔咒
另外,在玩了
CORS
之后,我认为使用Nginx
和proxy\u pass
将来自React SPA的请求传递到后端会容易得多,以避免完全使用CORS
,因为如果必须在不同的环境(如测试)中使用CORS
,在登台和etcs中,必须在web服务器级别设置CORS
,例如Nginx
,并且它需要的配置与我为本地环境设置的配置稍有不同。如果我是你,我会在json响应中发送令牌,并在前端设置cookie。如果不使用UI请求,api会更干净。您好,我和您有完全相同的问题。我所有的配置都和你的相似。。。你知道问题出在哪里吗?
# app_config related to flask-jwt-extended
CORS_HEADERS = "Content-Type"
JWT_TOKEN_LOCATION = ["cookies"]
JWT_COOKIE_SECURE = False
JWT_COOKIE_CSRF_PROTECT = True
# post method from flask-restful for LoginAPI class
def post(self):
email = request.json.get("email")
password = request.json.get("password")
# some processing here.....
payload = {
"email": email
}
access_token = create_access_token(identity=payload)
refresh_token = create_refresh_token(identity=payload)
response = jsonify({"status": True})
set_access_cookies(response, access_token)
set_refresh_cookies(response, refresh_token)
return response
# in below code, I had some issues with putting wildcard (*) into origin, so I've specified to the React SPA's host and port.
CORS(authentication_blueprint, resources={r"/authentication/*": {"origins": "http://localhost:3000"}},
supports_credentials=True)
# also tried `axios.defaults.withCredentials = true;` but same result.
export const login = (email, password, cookies) => {
return dispatch => {
const authData = {
email: email,
password: password
};
let url = 'http://127.0.0.1:5000/authentication/login/';
axios.post(url, authData, {withCredentials: true)
.then(
response => {
console.log(response)
})
.catch(err => {
console.log(err)
});
dispatch(authSuccess(email, password));
}
};