我有一个登录页面,它向我的服务器发出请求,服务器设置会话cookie并重定向到仪表板页面。在登录页面上,我可以在发送凭据后验证cookie设置是否正确,并且当我手动单击链接以在站点中导航时(如预期的那样),它将持续存在。
然而,当我尝试在登录功能成功后自动重定向到仪表板时,我的cookie未设置,我无法确定它去了哪里。我已经尝试通过document.location
/window.location
与不同的.href
/.path
/.url
字段管理重定向,但在调用任何这些或刷新页面后,cookie就消失了。
我使用自签名HTTPS127.0.0.1
与CORS(我不再收到CORS错误后很多头痛,所以我不认为问题是存在的,特别是因为我可以看到它存在没有重定向)。此外,我使用Svelte作为前端,使用Axum (Rust)作为后端,如果这很重要的话。
为什么我的饼干被"吃掉"了当试图强制用户重定向到另一个页面时?
请求方法:
await fetch('https://localhost:4000/users', {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: `{ "email": "${email}", "password": "${await hash}" }`
});
// cookie exists if this line is removed
document.location.href = '/dashboard';
// cookie is gone when the new page loads
server config (Axum):
let server = axum_server::bind_rustls(
SocketAddr::from(([127, 0, 0, 1], 4000)),
tls_config,
)
.serve(
Router::new()
.route("/", get(root))
.layer(
CorsLayer::new()
.allow_headers([
header::CONTENT_TYPE,
header::CONTENT_LENGTH,
header::COOKIE,
header::SET_COOKIE,
])
.allow_methods([
Method::GET,
Method::HEAD,
Method::OPTIONS,
Method::DELETE,
Method::POST,
])
.allow_origin([
HeaderValue::from_str("http://127.0.0.1:3000").unwrap(),
HeaderValue::from_str("https://127.0.0.1:3000").unwrap(),
])
.allow_credentials(true),
)
.into_make_service(),
);
响应标头:
HTTP/2 200 OK
content-type: application/json
set-cookie: session=1234; Path=/; HttpOnly; SameSite=None; Secure
content-length: 26
access-control-allow-origin: https://127.0.0.1:3000
access-control-allow-credentials: true
vary: origin
vary: access-control-request-method
vary: access-control-request-headers
date: Tue, 07 Jun 2022 01:56:11 GMT
我最终用axios
调用取代了我的fetch
调用,现在它按预期工作。我仍然不知道我是否用错了,但这些看起来对我来说是非常相同的…
await fetch('https://localhost:4000/users', {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: `{ "email": "${email}", "password": "${await hash}" }`
});
await axios.post('https://localhost:4000/users', {
email: email,
password: await hash,
}, {
withCredentials: true
});
如果有人能解释一下它们的区别,我会非常感兴趣的:)