问题描述
我正在尝试进行跨站点POST请求。我的前端是react native(javascript),后端是Flask。一切都适用于GET请求。但是当需要某些特定的标头时,我的POST请求都无法正常工作。
这是我的JavaScript请求:
export const postLike = async (note_id) => {
try {
let csrf_access_token = getCookie("csrf_access_token");
const csrf_refresh_token = getCookie("csrf_refresh_token");
const myHeaders = new Headers();
myHeaders.append("X-CSRF-TOKEN-ACCESS",csrf_access_token);
myHeaders.append("X-CSRF-TOKEN-REFRESH",csrf_refresh_token);
let response = await fetch(
BINDERS_MAIN_COMMENTS + `/notes/${note_id}/like`,{
method: "post",credentials: "include",headers: myHeaders,}
);
if (response.ok) {
return true;
} else {
return false;
}
} catch (error) {
return false;
}
};
getCookie函数用于从cookie中获取一些凭证并将其添加到标题中:
function getCookie(name) {
if (!document.cookie) {
return null;
}
const xsrfCookies = document.cookie
.split(";")
.map((c) => c.trim())
.filter((c) => c.startsWith(name + "="));
if (xsrfCookies.length === 0) {
return null;
}
return xsrfCookies[0].split("=")[1];
}
我的问题:这些标头(X-CSRF-TOKEN-ACCESS和X-CSRF-TOKEN-REFRESH)未在我的POST请求中发送。
请参见下面的选项预检请求和POST请求的屏幕截图,您将看到这两个标头在POST请求中具有空值:
这是我的Python配置:
class Config:
JWT_TOKEN_LOCATION = ['cookies']
JWT_COOKIE_SECURE = True
JWT_COOKIE_SAMESITE = "None"
JWT_REFRESH_TOKEN_EXPIRES = datetime.timedelta(days=15)
JWT_COOKIE_CSRF_PROTECT = True # set_refresh_cookies() will Now also set the non-httponly CSRF cookies
JWT_CSRF_CHECK_FORM = True
JWT_ACCESS_CSRF_HEADER_NAME = "X-CSRF-TOKEN-ACCESS"
JWT_REFRESH_CSRF_HEADER_NAME = "X-CSRF-TOKEN-REFRESH"
app.config.from_object(APP_CONfig[CONfig_ENV])
cors = CORS(
app,resources={
"/*": {
"origins": [
"http://127.0.0.1","http://127.0.0.1:19006","http://192.168.0.13","http://192.168.0.13:19006","http://192.168.1.38:19006","http://192.168.1.38",]
}
},supports_credentials=True,send_wilcard=True,always_send=True,vary_header=True,expose_headers=["Content-Type","X-CSRF-TOKEN-ACCESS","X-CSRF-TOKEN-REFRESH",],allow_headers=["Content-Type",)
最后的信息,这是一个HTTPS连接。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)