瞄准镜通行证-jwt

时间:2019-02-27 20:55:05

标签: javascript node.js passport.js passport-jwt

有人可以向我详细解释为什么/ profile的路由可以访问用户对象。我目前正在学习JavaScript和NodeJS,您的回答将对我的学习产生很大的帮助。谢谢。

app.post('/login',function (req, res) {
        let email = req.body.email;
        let password = req.body.password;
        User.getUserByEmail(email, (err, user) => {
            if (err) throw err;
            if (!user) {
                return res.json({
                    success: false,
                    message: "User not found!"
                });
            }
            User.comparePassword(password, user.password, (err, isMatch) => {
                if (err) throw err;
                if (isMatch) {
                    var token = jwt.sign(user.toJSON(), config.JWT_SECRET, {
                        expiresIn: '15m'
                    });
                    res.json({
                        success: true,
                        token: token,
                        user: {
                            id: user._id,
                            email: user.email
                        }
                    });
                } else {
                    return res.json({
                        success: false,
                        message: "Password incorrect!"
                    });
                }
            })
        });
    });

    app.get('/profile', passport.authenticate('jwt', {
        session: false
    }), (req, res) => {
        res.json({user: req.user});
    });

2 个答案:

答案 0 :(得分:0)

这是因为您的passport.authenticate()呼叫将user填充到req

来自passports.org:

app.post('/login',
  passport.authenticate('local'),
  function(req, res) {
    // If this function gets called, authentication was successful.
    // `req.user` contains the authenticated user.
    res.redirect('/users/' + req.user.username);
  });

除了您的路径和身份验证方法不同之外,您的路由也相同。

有关更多信息,请参见文档:http://www.passportjs.org/docs/authenticate/

答案 1 :(得分:0)

一些背景

  • 函数app.get使用url作为签名的(req, res, next) => {}一个或多个回调
  • 回调一个接一个地执行。在任何这些回调 中,您可以修改req对象,它将“传播” 到下一个回调
  • 要从回调切换到下一个回调,请致电next

以您的情况

  • passport.authenticate('jwt', {sessions: false})的调用会返回回调,该回调在您发送json响应之前执行。
  • 该回调本身会增强用户,然后将其值“注入” req对象中。
  • 正如我之前提到的,此req“传播” 到下一个回调。这就是为什么当您发送json响应时,该响应req已经包含user