代码之家  ›  专栏  ›  技术社区  ›  jam j

jwt身份验证问题“未授权用户访问”,状态代码为401

  •  0
  • jam j  · 技术社区  · 1 年前

    当我检查Thunder客户端时,它给了我jwt身份验证问题“未授权用户访问”问题,状态代码为401

    JWT令牌生成成功后,工作正常

    这是代码

    app.get('/p3', async (req, res) => {
        let token = req.headers.authorization
        console.log('Main token: ' + token)
    
        if (!token) {
            return res.status(401).json({ message: 'Un-authorization' });
        }
    
        try {
            token = token.split(' ')[1];
            const user = jwt.verify(token, 'secret-key');
            console.log(user);
        } catch (e) {
            return res.status(400).json({ message: 'Invalid Token' });
        }
    
        return res.status(200).json({ message: 'I am a private route' });
    })
    

    但是当我试图用数据库检查用户身份时,它显示错误

    {
      "message": "Un-authorization user access"
    }
    

    路线

    http://localhost:4000/p4
    

    这是代码

    app.get('/p4', async (req, res) => {
        let token = req.headers.authorization
        console.log('Main token: ' + token)
    
        if (!token) {
            return res.status(401).json({ message: 'Un-authorization access' });
        }
    
        try {
            token = token.split(' ')[1];
            const decoded = jwt.verify(token, 'secret-key');
            const user = await User.findById(decoded._id);
            console.log(user);
    
            if (!user) {
                return res.status(401).json({ message: 'Un-authorization user access' });
            }
    
        } catch (e) {
            return res.status(400).json({ message: 'Invalid Token' });
        }
    
        return res.status(200).json({ message: 'I am a private route' });
    })
    

    此处为登录路径以供参考

    app.post('/login', async (req, res, next) => {
        console.log(req.body);
        const { email, password } = req.body
    
        try {
    
            const user = await User.findOne({ email });
            console.log(user)
            if (!user) {
                return res.status(400).json({ message: "Invalid Credentials, Please registered" });
            }
    
            const isMatchPassword = await bcrypt.compare(password, user.password)   
            if (!isMatchPassword) {
                return res.status(400).json({ message: "Invalid Credentials, Please registered" });
            }
    
            delete user._doc.password
            delete user._doc._id
            delete user._doc.roles
    
            const token = jwt.sign(user._doc, 'secret-key', { expiresIn: '1h' })     
    
            return res.status(200).json({ message: "Login Successfull", token });
        } catch (e) {
            next(e);
        }
    });
    

    我尝试使用多个用户凭据,但结果相同

    0 回复  |  直到 1 年前
        1
  •  0
  •   WeDoTheBest4You    1 年前

    给定的值与集合中的键_id不匹配,因此findById返回null,因此,Express以401作为响应,因为它已被编码。

    ..
    const user = await User.findById(decoded._id);
    …
    return res.status(401).json({ message: 'Un-authorization user access' });
    

    请注意,当给定值为以下任一值时 未定义或为空 ,然后mongose将准备并执行以下查询,这也意味着给定的值null与_id不匹配。

    User.findOne({ _id: null }, {})
    

    请传递一个与集合中的键_id匹配的值。

    引用:

    Model.findById()