Javascript 如何通过POST请求解决烧瓶中的CORS问题?
我有以下js函数提供登录:Javascript 如何通过POST请求解决烧瓶中的CORS问题?,javascript,python,json,flask,cors,Javascript,Python,Json,Flask,Cors,我有以下js函数提供登录: function login(){ const user = { username: document.getElementById("username_id").value, password: document.getElementById("pass_id").value }; var xhr = new XMLHttpRequest(); xhr.with
function login(){
const user = {
username: document.getElementById("username_id").value,
password: document.getElementById("pass_id").value
};
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.crossorigin = true;
xhr.addEventListener("readystatechange", function() {
if(this.readyState === 4) {
console.log(user);
console.log(this.responseText);
localStorage.setItem("user", JSON.parse(xhr.responseText).access_token)
}
});
xhr.open("POST", "http://127.0.0.1:5000/login");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Access-Control-Allow-Credentials", "true");
let data = JSON.stringify(user);
xhr.send(data);
}
在烧瓶中按以下路线操作:
@api_blueprint.route("/login", methods=["POST"])
@cross_origin(support_credentials=True)
def login():
from app import bcrypt
data = LoginData().load(request.json)
if data:
user = dbu.get_entry_by_username(user_table, username=data["username"])
hpw = bcrypt.generate_password_hash(data["password"])
if not user:
return jsonify({"message": "Couldn't find user!"})
if bcrypt.check_password_hash(hpw, data["password"]):
access_token = create_access_token(identity=data["username"], expires_delta=datetime.timedelta(days=365))
return jsonify(access_token=access_token, id=user.id), 200
此外,我在我的flask应用程序中启用了CORS:
from flask_cors import CORS
CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'
app.config['CORS_SUPPORTS_CREDENTIALS'] = True
问题是,当我尝试使用js登录时,控制台中出现了一个错误,即响应中“Access Control Allow Credentials”(访问控制允许凭据)头的值为“”,当请求的凭据模式为“include”(包括)时,该值必须为“true”。我不知道在其他地方可以将这些凭据设置为true。
我的应用程序中还有两个GET请求,它们运行时没有任何问题。
如何修复它?服务器必须设置
访问控制允许凭据
头,因此响应中的“…为”…”@Andreas yes,并且我的路由中有支持\u凭据=True
。flask cors文档:支持_凭证(bool)–允许用户发出经过身份验证的请求。如果为true,则在响应中注入访问控制允许凭据标头。这允许跨域提交cookie和凭据。