ExpressJS & Passport Pass Req, Res - PullRequest
       10

ExpressJS & Passport Pass Req, Res

0 голосов
/ 07 марта 2019

Я пытаюсь передать req & res через функцию обратного вызова, чтобы проверить ip пользователя, используя requestIp, чтобы предотвратить многоуровневый учет, любая помощь будет очень признательна. (req.clientIp возвращает ip пользователя)

фрагмент файла users.js:

router.get('/google', passport.authenticate('google', {
  scope: ['profile', 'email']
}));
router.get('/google/callback', (req, res) => {
  passport.authenticate('google', {
    failureRedirect: '/users/register'
  }), (req, res) => {
    res.redirect('/dashboard');
  };
});

фрагмент файла passport.js:

  passport.use(new GoogleStrategy({
    clientID: keys.googleClientId,
    clientSecret: keys.googleClientSecret,
    callbackURL: '/users/google/callback',
    proxy: true
  }, (accessToken, refreshToken, profile, done) => {
    console.log(accessToken, profile);

    // const image = profile.photos[0].value;
    const email = profile.emails[0].value;
    var google = {
      googleID: profile.id,
      firstName: profile.name.givenName,
      lastName: profile.name.familyName,
      image: profile.photos[0].value
    }
    console.log(google);

    User.findOne({
      email: email
    }).then(user => {
      if (user) {
        user.google = google
        user.save().then(() => {
          done(null, user);
        });
      } else {
        console.log('no user');
        new User({
          email: email,
          username: `${google.firstName} ${google.lastName}`,
          google: google
        }).save().then(user => {
          done(null, user);
        });
      };
    });
  }));

Редактировать: я хочу получить доступ к req & res в файле passport.js. Кроме этого все работает

Если вам нужна дополнительная информация, я предоставлю ее, спасибо.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Вы можете передать объект запроса в ваш обратный вызов проверки с помощью опции passReqToCallback. Обратный вызов проверки будет иметь объект запроса в качестве первого аргумента, а остальное следует как обычно. Как это

passport.use(new GoogleStrategy({
  // ...
  passReqToCallback: true
}, (req, accessToken, refreshToken, profile, done) => {
  // access to req
})

Также не забудьте исправить настройку маршрута '/google/callback'. Там по крайней мере одна конечная скобка отсутствует. И у вас нет функции, возвращаемой authenticate() при фактическом вызове (она должна иметь форму authenticate()() в анонимной функции).

0 голосов
/ 07 марта 2019

Проблема в router.get ('/ google' ... Вы должны отправить что-нибудь обратно клиенту.

router.get('/google', function(req,res){
  passport.authenticate('google', {
    scope: ['profile', 'email']
  });
  res.send('something');
});
router.get('/google/callback', (req, res) => {
  passport.authenticate('google', {
    failureRedirect: '/users/register'
  }), (req, res) => {
    res.redirect('/dashboard');//as these you send something
  };
});
...