Argon2密码验证通过后,为什么后续请求还是需要重新验证用户身份?

Tr° 尚文 阅读 26

我在用Express和argon2做密码登录功能,登录时argon2.verify对比密码成功后,用session记录了用户ID。但之后调用保护的API时,express-session突然显示用户未登录了,难道每次请求都要重新用argon2验证密码吗?

尝试过这样写登录逻辑:

await argon2.verify(hash, password).then(() => {
  req.session.userId = user.id;
  res.json({ success: true });
});

但访问/api/dashboard时还是会触发未认证的拦截,明明设置了resave和saveUninitialized为true…

我来解答 赞 9 收藏
二维码
手机扫码查看
1 条解答
诸葛毓君
这不是argon2的问题,而是express-session的配置或使用可能出了点小状况。通用的做法是登录后用session保存用户ID,后续请求通过session来验证身份,而不是每次都重新用argon2验证密码(那样效率太低了)。

你遇到的情况可能是session没正确保存或者丢失了。先检查这几个地方:
1. 确保用了cookie-parser中间件,因为express-session依赖它。
2. session存储设置里resavesaveUninitialized确实是true,但更重要的是secret是否设置了,比如:secret: 'your-secret-key'
3. 如果用的是浏览器客户端,确认cookies有没有正确发送到服务器端,有时候跨域会干扰cookies。

下面是一个完整的登录和路由保护示例,你可以对比一下:
const express = require('express');
const session = require('express-session');
const argon2 = require('argon2');
const app = express();

app.use(session({
secret: 'your-secret-key',
resave: true,
saveUninitialized: true,
cookie: { secure: false } // 如果不是https,要设为false
}));

// 登录接口
app.post('/login', async (req, res) => {
const user = await findUserSomehow(req.body.username); // 假设这是你的查询逻辑
if (user && await argon2.verify(user.passwordHash, req.body.password)) {
req.session.userId = user.id;
res.json({ success: true });
} else {
res.status(401).json({ error: 'Invalid credentials' });
}
});

// 受保护的路由
app.get('/dashboard', (req, res) => {
if (!req.session.userId) return res.status(401).json({ error: 'Not authenticated' });
res.json({ message: 'You are authenticated!', userId: req.session.userId });
});

app.listen(3000, () => console.log('Server running on port 3000'));


如果还是有问题,可能是其他地方干扰了session机制,比如CORS配置或者客户端代码没正确处理cookies。多看看控制台的日志输出吧,一般都能找到线索。
点赞 17
2026-01-29 09:40