You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户登录接口Post请求出现401未授权错误,求代码重构方案

登录路由401错误修复重构方案

原代码核心问题

  • 逻辑分支完全混乱:用户不存在时返回401后还继续执行密码解密(此时user为undefined,直接触发报错),且未终止代码执行
  • 密码校验依赖的Orginalpassword变量初始化位置错误,仅在用户不存在的分支里赋值,导致校验时变量未定义
  • Token生成、用户信息过滤的逻辑被错误放在密码不匹配的分支,完全违背登录成功的流程
  • 未在响应返回后终止代码,导致后续逻辑继续执行引发异常

重构后的代码

router.post('/login', async (req, res, next) => {
    try {
        // 从数据库查找对应用户
        const user = await User.findOne({ username: req.body.username });
        
        // 用户不存在直接返回401,终止后续逻辑
        if (!user) {
            return res.status(401).json('wrong credentials!');
        }

        // 解密数据库中存储的加密密码
        const hashedPassword = Cryptojs.AES.decrypt(
            user.password, 
            process.env.PASS_SEC
        );
        const originalPassword = hashedPassword.toString(Cryptojs.enc.Utf8);

        // 校验输入密码是否匹配原密码,不匹配则返回401
        if (originalPassword !== req.body.password) {
            return res.status(401).json('wrong credentials!');
        }

        // 登录成功:生成JWT令牌
        const accessToken = jwt.sign(
            { id: user._id, isAdmin: user.isAdmin },
            process.env.JWT_SEC,
            { expiresIn: '3d' }
        );

        // 过滤用户敏感信息,返回登录成功数据
        const { password, ...others } = user._doc;
        return res.status(200).json({ ...others, accessToken });

    } catch (error) {
        // 捕获所有异常,返回服务器错误信息
        return res.status(500).json(error.message || '服务器内部错误');
    }
});

关键修复点

  • 调整逻辑顺序:严格按照「查用户→解密密码→校验密码→处理登录成功」的流程执行,符合登录业务逻辑
  • 所有响应返回后添加return,确保代码执行终止,避免后续无效逻辑引发异常
  • 修正变量命名(Orginalpassword改为originalPassword,符合JS驼峰命名规范)
  • 将Token生成、用户信息过滤逻辑移至密码匹配成功的分支,确保仅登录成功时执行
  • 优化异常处理,返回更清晰的错误提示

内容的提问来源于stack exchange,提问作者DannyMac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:30:44