Cookie已发送,但在部署时不会存储



我在Vercel(前端(和Heroku(后端(托管的MERN应用程序中遇到cookie问题

在localhost中一切都很好,但在部署时,我在存储cookie方面遇到了问题。Set Cookie与登录请求一起发送,请求本身看起来很好我没有任何错误

登录后,经过身份验证的路由会返回我对每个用户的期望,因此即使cookie没有存储在前端的存储下,后端似乎也可以访问cookie,我认为这是一个安全问题。这是而不是Safari中的情况,在Safari中,cookie在登录后消失,因此用户再次注销。

唯一不起作用的途径是签出。在注销时,我清除了令牌cookie,但它试图删除技术上不存在的东西,仍然没有错误 更新:清除cookie有效我在注销时没有发回任何数据,所以前端认为它没有响应,添加.send({ message: 'Sign Out Successful' })解决了这个问题。但是,在前端存储中仍然看不到cookie。

对于CORS设置,我将原点设置为前端url,并将凭据设置为true。在前端,我对每个请求都设置了withCredentials: true

部署时,cookie使用sameSite: nonesecure: true

以下是登录和注销路线,但您可以在此处找到完整的后端代码,并在GitHub上找到前端代码。

后端登录路径

import type Route from '../../types/Route'
import jwt from 'jsonwebtoken'
import env from '../../env/env'
import bcrypt from 'bcryptjs'
import User from '../../models/User'
import validateSignIn from '../../utils/validation/signIn'
const route: Route = {
method: 'post',
execute: async (req, res) => {
const { username, password } = req.body.user
try {
const { errors, valid } = validateSignIn(username, password)
if (!valid) return res.status(401).send({ errors })

const user = await User.findOne({ username })
if (!user) return res.status(404).send({ errors: { username: 'User not found' }})
const correctPassword = await bcrypt.compare(password, user.password)
if (!correctPassword) return res.status(401).send({ errors: { password: 'Wrong password' } })
const token = jwt.sign({ userId: user._id }, env.SECRET, { expiresIn: "1hr" })
return res.status(200).cookie('token', token, {
expires: new Date(Date.now() + 604800000),
secure: env.ENVIRONMENT === 'LIVE',
sameSite: env.ENVIRONMENT === 'LIVE' ? 'none' : 'lax',
httpOnly: true
}).send(user)
} catch (error) {
console.log('@sign/in', error)
return res.sendStatus(500)
}
}
}
export default route

后端注销路由:

import type Route from '../../types/Route'
import authorization from '../../middlewares/http'
import env from '../../env/env'
// TODO: Fix Sign Out
const route: Route = {
method: 'get',
authorization,
execute: async (req, res) => {
try {
return res.clearCookie('token').sendStatus(200)
} catch (error) {
console.log('@sign/out', error)
return res.status(500)
}
}
}
export default route

.clearCookie((文档显示

Web浏览器和其他兼容客户端只有在给定的选项与res.cokie((相同的情况下才会清除cookie,不包括过期和maxAge。

所以,试着让你的clear操作与你的set操作匹配,比如这样。

res
.clearCookie('token', token, {
secure: env.ENVIRONMENT === 'LIVE',
sameSite: env.ENVIRONMENT === 'LIVE' ? 'none' : 'lax',
httpOnly: true })
.sendStatus(200)

相关内容

  • 没有找到相关文章

最新更新