Запрос ExpressJS и Passport pass, res

#node.js #express #passport.js

#node.js #экспресс #passport.js

Вопрос:

Я пытаюсь передать запрос и разрешение на обратный вызов, чтобы проверить ip пользователя, используя подсказку для предотвращения множественного учета, любая помощь была бы очень признательна. (запрос.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);
        });
      };
    });
  }));
  

Редактировать: я хочу получить доступ к запросу и разрешениям в passport.js файл. В остальном все работает

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

Ответ №1:

Проблема в 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
  };
});  

Комментарии:

1. Извините, я не был конкретен, я хотел получить доступ к запросу и разрешениям в passport.js файл. В остальном все работает так, как должно

Ответ №2:

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

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

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