Я пытаюсь использовать PassportJS для аутентификации с помощью стратегии github. Раньше я успешно использовал PassportJS, но не с github-стратегией, хотя я не думаю, что это должно сильно отличаться. / viewData - это маршрут, по которому я тестирую аутентификацию.
Стратегия успешно аутентифицируется и помещает данные в базу данных, и когда я сериализую и десериализую пользовательские данные, они действительно там. Проблема возникает, когда я пытаюсь проверить любой маршрут после того, как существует req.isAuthenticated () или даже если req.session.passport.user существует, и он возвращает false и undefined соответственно. Странная вещь та же проверка в app.js после того, как я перенаправил через / testAuth, журналы аутентификации правильно с истинным и id #. Так что я чувствую, что это какая-то проблема с экспресс-сессией или с интеграцией паспорта, которая нарушает его, но я не могу ее найти. Я занимаюсь этим долгое время, поэтому надеюсь, что кто-нибудь сможет мне помочь.
app.use(cookieParser('test'));
app.use(session({
secret: 'test',
resave: false,
saveUninitialized: true
}));
//pasport setup
app.use(passport.initialize());
app.use(passport.session());
// Passport init
passport.use(new GithubStrategy({
clientID: config.github.clientID,
clientSecret: config.github.clientSecret,
callbackURL: config.github.callbackURL },
function(accessToken, refreshToken, profile, done) {
User.findOne({ oauthID: profile.id }, function(err, user) {
if(err) {
console.log(err); // handle errors!
}
if (!err && user !== null) {
done(null, user);
} else {
user = new User({
oauthID: profile.id,
name: profile.displayName,
created: Date.now()
});
user.save(function(err) {
if(err) {
console.log(err); // handle errors!
} else {
console.log("saving user ...");
done(null, user);
}
});
}
});
}
));
// test authentication
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
console.log("Not Authenticated", req.user);
res.redirect('/');
}
app.get('/testAuth', ensureAuthenticated, function(req, res){
User.findById(req.session.passport.user, function(err, user) {
if(err) {
console.log(err); // handle errors
} else {
res.redirect('/viewData');
}
});
});
//auth pages
app.get('/auth/github',
passport.authenticate('github'),
function(req, res){});
app.get('/auth/github/callback',
passport.authenticate('github', { failureRedirect: '/' }),
function(req, res) {
res.redirect('/testAuth');
});
// serialize and deserialize for session
passport.serializeUser(function(user, done) {
console.log('serializeUser: ' + user);
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user){
console.log('deserializeUser: ' + user);
if(!err) done(null, user);
else done(err, null);
});
});