ExpressJS和Passport通行证要求,分辨率

时间:2019-03-07 10:10:19

标签: node.js express passport.js

我正尝试将req&res传递给回调,以使用requestIp来检查用户的ip,以防止进行多次记帐,非常感谢您的帮助。 (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);
        });
      };
    });
  }));

编辑:我想访问passport.js文件中的req&res。除此之外,一切正常

如果您需要更多信息,我会提供,谢谢。

2 个答案:

答案 0 :(得分:0)

问题出在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 :(得分:0)

您可以使用passReqToCallback选项将请求对象传递到您的验证回调。验证回调将把请求对象作为第一个参数,其余的照常执行。像这样

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

此外,请记住要修复'/google/callback'路由设置。至少缺少一个结尾括号。而且您实际上并没有调用authenticate()返回的函数(在匿名函数中,其形式应为authenticate()())。