Вход в SailsJS v1.0 Github с использованием passport-github2 не работает
У нас было приложение Sails.JS v0.12, которое недавно было обновлено до Sails.JS v1.0. Ранее мы использовали паспорт для локальной стратегии входа в систему (электронная почта) и использовали passport-github2 для пакета проверки подлинности GitHub npm. После того, как мы обновили Sails.JS, наш passport-github2 больше не работает, но наша локальная стратегия для паспорта все еще работает, как и ожидалось.
До сих пор я идентифицировал подозрительную функцию обратного вызова GitHub:
passport.authenticate('github',
function (req, res) {
res.redirect('/home');
})(req, res, next);
Функция (req,res) больше не захватывает объект res, а вместо этого захватывает пользователя github. Я не уверен, почему это происходит.
Я вставляю код здесь в надежде, что кто-то определит проблему:
config.http.js:
module.exports.http = {
middleware: {
passportInit : require('passport').initialize(),
passportSession : require('passport').session(),
order: [
'cookieParser',
'session',
'passportInit',
'passportSession',
'bodyParser',
'compress',
'poweredBy',
'router',
'www',
'favicon',
],
};
AuthController: (только вставка функций github)
'github': function (req, res, next) {
passport.authenticate('github', {
scope: ['user:email', 'repo'],
failureRedirect: '/signin',
},
function (err, user) {
sails.log.debug(user);
req.logIn(user, function (err) {
if (!err) {
req.session.authenticated = true;
req.session.user = user;
//check user role type
var userRoles = user.userRoles;
if (userRoles) {
var isSuperAdmin = false;
for(var x =0;x < userRoles.length; x++){
if (userRoles[x].toUpperCase() == roles.SUPER_ADMIN.toUpperCase()) {
isSuperAdmin = true;
break;
}
}
if(isSuperAdmin){
req.session.isSuperAdmin = true;
res.redirect('/admin');
}
else{
res.redirect('/home');
}
}
else {
res.redirect('/home');
}
}
});
})(req, res, next);
},
'github/callback': function (req, res, next) {
passport.authenticate('github',
function (req, res) {
// when this callback occurs, the req is empty and res contains the github user instead of an actual response object
res.redirect('/home');
})(req, res, next);
}
};
config.passport.js:
var passport = require('passport'),
GitHubStrategy = require('passport-github2').Strategy,
LocalStrategy = require('passport-local').Strategy,
roles = require('../api/constants/Roles.js');
var githubVerifyHandler = function (token, tokenSecret, profile, done) {
process.nextTick(function () {
console.log('github authentication');
User.findOne({
uid: profile.id
}, function (err, user) {
if (user) {
if (user.token !== token) {
User.update({ uid: profile.id }, { token: token }, function () {
// runs till here successfully, user is being returned as authenticated
return done(null, user);
});
} else {
return done(null, user);
}
} else {
var data = {
provider: profile.provider,
uid: profile.id,
name: profile.displayName,
token,
tokenSecret
};
if (profile.emails && profile.emails[0] && profile.emails[0].value) {
data.email = profile.emails[0].value;
}
if (profile.name && profile.name.givenName) {
//data.firstname = profile.name.givenName;
}
User.create(data).fetch().exec(function (err, user) {
return done(err, user);
});
}
});
});
};
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findOne({
id: id
}, function (err, user) {
done(err, user);
});
});
passport.use(new GitHubStrategy({
clientID: CLIENT_ID, // Use your github client id
clientSecret: CLIENT_SECRET, // Use your github client secret
callbackURL: 'http://localhost:1337/auth/github/callback'
}, githubVerifyHandler));