Область доступа Passport-JWT - PullRequest
0 голосов
/ 27 февраля 2019

Может кто-нибудь подробно объяснить мне, почему у маршрута / профиля есть доступ к объекту пользователя.В настоящее время я изучаю 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 голосов
/ 28 февраля 2019

Некоторый фон

  • Функция app.get принимает url и один или несколько обратных вызовов с (req, res, next) => {} в качестве своей подписи
  • Обратные вызовы выполняются один за другим.В любом из этих обратных вызовов вы можете изменить req объект , и он будет "распространяться" на следующие обратные вызовы
  • Для переключения собратный вызов следующего, вы звоните next

В вашем случае

  • Вызов passport.authenticate('jwt', {sessions: false}) возвращает обратный вызов , этовыполняется перед отправкой ответа json.
  • Этот сам обратный вызов проверяет пользователя, затем "внедряет" его значение в объект req.
  • Как я упоминал ранее, этот req будет "распространяться" до следующего обратного вызова.И именно поэтому, когда вы отправляете свой ответ json, он req уже содержит ключ user
0 голосов
/ 28 февраля 2019

Это потому, что ваш 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...