我正在制作一个简单的express.js应用程序,它有一个发送请求的登录表单,如果经过身份验证,则重定向到前端页面并将JWT令牌附加到网站的cookie。正在生成 JWT 令牌,正在重定向用户,但未设置任何令牌。
这是 server.js:
app.use(cookieParser());
const allowedOrigins = ['http://127.0.0.1:5501', 'http://127.0.0.1:5500']; // Live server ports
app.use(cors({
origin: allowedOrigins,
credentials: true // Permite envio de cookies e outras credenciais
}));
dotenv.config()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
登录路径如下:
router.post('/', (req, res) => {
console.log('\n\n\n-----------------------/LOGIN/--------------------------');
const { login, senha } = req.body;
try {
const users = ler_dbJSON();
const conta = users.filter(user => user.senha === senha && user.login === login);
if (conta.length > 0) {
const contaVerificada = conta[0]
const secret = process.env.SECRET;
const token = jwt.sign({ id: contaVerificada.id }, secret, { expiresIn: "7d" });
console.log("Token: ", token)
res.cookie("token", token, {
httpOnly: true,
sameSite: 'lax',
secure: true
});
const responseUrl = contaVerificada.adm === true ? "page1.html" : `pages2.html`;
console.log('-----------------------/LOGIN/--------------------------\n\n\n');
return res.status(200).json({ url: responseUrl });
} else {
return res.status(401).json({ msg: "Login ou senha incorretos." });
}
} catch (err) {
return res.status(500).json({ msg: "Ocorreu um erro ao carregar o banco de dados", erro: err.message });
}
});
最后是前端的请求
axios.post(api_url, {
login: login,
senha: senha
}, { withCredentials: true }
我已经使用邮递员测试了路线,它工作得很好。在前端它部分工作,我按预期被重定向到正确的页面,但不存在 cookie(通过检查页面并使用 console.log() 进行测试,两者都显示了一个没有 cookie 的页面。)
选项1:
检查 res.cookie 中的安全选项
secure: true 选项意味着 cookie 将仅通过 HTTPS 设置。如果您在没有 HTTPS 的本地主机上进行测试,这将阻止设置 cookie。
要解决此问题,请在本地开发期间设置 secure: false,或者添加逻辑以根据环境动态设置它:
res.cookie("token", token, {
httpOnly: true,
sameSite: 'lax',
secure: process.env.NODE_ENV === 'production' // Only set secure in production
});
选项 2:调试 Set-Cookie 标头
要确认 cookie 确实正在发送,您可以在浏览器的开发人员工具中检查响应标头(在“网络”>“响应标头”下)。登录请求后,在后端的响应中查找 Set-Cookie 标头。
如果缺少Set-Cookie,则可能表明服务器端的cookie设置方式存在问题。