fix: 修复验证码session保存时序问题
问题原因: - 验证码API在session.save()完成前就发送响应 - 导致客户端获取验证码图片时session可能未保存成功 修复: - 将res.send()移到session.save()回调内 - 确保session保存成功后再返回验证码图片 - 添加验证码验证调试日志帮助诊断 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1116,19 +1116,26 @@ function verifyCaptcha(req, captcha) {
|
||||
const sessionCaptcha = req.session.captcha;
|
||||
const captchaTime = req.session.captchaTime;
|
||||
|
||||
// 调试日志
|
||||
console.log('[验证码验证] SessionID:', req.sessionID, '输入:', captcha?.toLowerCase(), 'Session中:', sessionCaptcha);
|
||||
|
||||
if (!sessionCaptcha || !captchaTime) {
|
||||
console.log('[验证码验证] 失败: session中无验证码');
|
||||
return { valid: false, message: '验证码已过期,请刷新验证码' };
|
||||
}
|
||||
|
||||
// 验证码有效期5分钟
|
||||
if (Date.now() - captchaTime > 5 * 60 * 1000) {
|
||||
console.log('[验证码验证] 失败: 验证码已超时');
|
||||
return { valid: false, message: '验证码已过期,请刷新验证码' };
|
||||
}
|
||||
|
||||
if (captcha.toLowerCase() !== sessionCaptcha) {
|
||||
console.log('[验证码验证] 失败: 验证码不匹配');
|
||||
return { valid: false, message: '验证码错误' };
|
||||
}
|
||||
|
||||
console.log('[验证码验证] 成功');
|
||||
// 验证通过后清除session中的验证码
|
||||
delete req.session.captcha;
|
||||
delete req.session.captchaTime;
|
||||
@@ -1172,18 +1179,19 @@ app.get('/api/captcha', captchaRateLimitMiddleware, (req, res) => {
|
||||
req.session.captcha = captcha.text.toLowerCase();
|
||||
req.session.captchaTime = Date.now();
|
||||
|
||||
// 保存session
|
||||
// 保存session后再返回响应(修复:确保session保存成功)
|
||||
req.session.save((err) => {
|
||||
if (err) {
|
||||
console.error('[验证码] Session保存失败:', err);
|
||||
} else {
|
||||
// 安全:不记录验证码明文到日志
|
||||
console.log('[验证码] 生成成功, SessionID:', req.sessionID);
|
||||
}
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: '验证码生成失败'
|
||||
});
|
||||
|
||||
}
|
||||
console.log('[验证码] 生成成功, SessionID:', req.sessionID);
|
||||
res.type('svg');
|
||||
res.send(captcha.data);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('生成验证码失败:', error);
|
||||
res.status(500).json({
|
||||
|
||||
Reference in New Issue
Block a user