我正尝试将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。除此之外,一切正常
如果您需要更多信息,我会提供,谢谢。
答案 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()()
)。