当您进入网站时,Cookie 会被设置,一切正常,但是当您重新加载页面时,设置的 Cookie 会被删除
登录响应(返回):
export const sendAccessTokenAndRefreshToken = (response:ServerResponse, accesstoken:string, refreshtoken:string) => {
response.writeHead(200, {
'Content-Type': 'text/json; application/json',
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,PATCH,OPTIONS",
"Access-Control-Allow-Origin": "http://localhost:3000",
"Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization",
'Set-Cookie': [`refreshtoken=${refreshtoken}; Secure; HttpOnly; SameSite=None; Path=/; Max-Age=99999999;`]
});
response.end(JSON.stringify({accesstoken}));
}
响应选项(cors):
response.writeHead(200, {
'Content-Type': 'text/json; application/json',
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Origin": "http://localhost:3000",
"Access-Control-Expose-Headers": "Authorization",
"Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization",
});
response.end(JSON.stringify({message: 'Cors Work!'}));
登录完成后:
网站重新加载后:
在这张图片中,您可以看到发送 post 请求时,会显示 cookie,但重新启动后它会消失
前端登录.js:
const body = {
login: login_input.value,
password: password_input.value
}
fetch('http://127.0.0.1:3000/login', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify(body)
})
.then((response) => response.json())
.then((json) => {
localStorage.setItem('token', json.accesstoken);
如何解决这个问题?我尝试使用 cors 浏览器扩展,但即使这样也没有帮助
如何在不借助无关框架的情况下解决这个问题?
我怀疑是在下面的代码中使用了 ' 和 ` 引号:
"Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization", “设置 Cookie”:[
refreshtoken=${refreshtoken}; Secure; HttpOnly; SameSite=None; Path=/; Max-Age=99999999;
]
删除 '` 并删除 [],你也不应该拥有它。
类似:
"Set-Cookie": "refreshtoken=${refreshtoken}; Secure; HttpOnly; SameSite=None; Path=/; Max-Age=99999999;"
那么将刷新令牌存储在 cookie 中是否是一个好主意,这是一个不同的问题,但这是一个不同的讨论。
为了补充这个答案,我写了一篇博客文章,更详细地介绍了这个主题:调试 cookie 问题
如果 Cookie 没有过期日期,则该 Cookie 被视为会话 Cookie,刷新时会被清除。
另一个可能的原因是“HttpOnly”属性。每次用户关闭或刷新页面时,我的 Chrome 都会删除 HttpOnly cookie,即使 cookie 尚未过期。