使用mongoose-encryption加密后登录失败、页面持续加载问题求助
问题根因
你启用mongoose-encryption加密password字段后,数据库不会再存储明文的password字段,加密内容会被存到你数据库记录里看到的_ct、_ac这类内置字段中,所以你直接把明文密码作为查询条件查找用户时,MongoDB里根本没有对应的password字段匹配,自然查不到用户。
另外你页面一直加载的原因是:登录逻辑中查询不到用户的分支里,你只打印了错误日志,没有给前端返回任何响应,前端会一直等待服务端返回结果,就会出现加载卡死的情况。
修复方案
修改登录查询逻辑:先仅通过邮箱查询用户,mongoose-encryption会在查询到用户后自动解密还原password字段,再手动比对用户输入的密码和解密后的密码是否一致即可,同时给所有逻辑分支补充服务端响应。
修复后的登录接口代码示例
app.post('/login', (req, res) => { const email = req.body.username; const inputPassword = req.body.password; // 只传邮箱作为查询条件 User.findOne({email: email}, (err, user) => { if(err) { console.error(err); return res.status(500).send('服务器异常,请稍后重试'); } if(!user){ console.error('You are never registered!'); // 替换为你实际的未注册响应逻辑,比如跳回登录页 return res.redirect('/login?msg=未找到该账号'); } // 解密后的password可以直接比对 if(user.password === inputPassword) { console.log('You are already registered!'); res.render('secrets'); } else { console.error('密码错误'); // 替换为你实际的密码错误响应逻辑 res.redirect('/login?msg=密码错误'); } }); });
内容的提问来源于stack exchange,提问作者Codecygen
相关产品推荐
相关产品推荐

