请注意:有很多这样的问题,但是没有一个对我有用,这就是为什么我问这个问题。
我的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
127.0.0.1
而不是localhost
上运行我需要某种前端代理吗?必须有一个更简单的解决方案。
答案 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)时该字段为空。
我希望这会有所帮助!