我的护照出了差错。我正在构建一个使用restify的api。我使用客户会话与谷歌oauth 2的会话和护照。
我有麻烦,在这一点上,它将序列化用户和创建一个会话。我似乎没有收到任何错误,但是它正在将大型节点对象打印到控制台。
var restify = require('restify');
var massive = require('massive');
var passport = require('passport');
var GoogleStrategy = require('passport-google-oauth2').Strategy;
var _ = require('lodash');
var sessions = require("client-sessions");
var app = function(config, done) {
// declare DB and server
var server = restify.createServer(),
db;
// Set server settings
server.use(restify.bodyParser());
server.pre(restify.pre.sanitizePath());
server.use(restify.queryParser());
server.use(sessions({
// cookie name dictates the key name added to the request object
cookieName: 'Skyrail_session',
// should be a large unguessable string
secret: 'abc123yyighhcggfgucgdguhvgcydtfugjvhfguijkvhgcfgvcfg',
// how long the session will stay valid in ms
duration: 24 * 60 * 60 * 1000,
activeDuration: 1000 * 60 * 5
}));
server.use(passport.initialize());
server.use(passport.session());
server.use(function logger(req, res, next) {
console.log(new Date(), req.method, req.url);
next();
});
server.on('uncaughtException', function(request, response, route, error) {
console.error(error.stack);
response.send(error);
});
// passport auth settings
passport.use(new GoogleStrategy({
clientID: ID,
clientSecret: SECRET,
callbackURL: 'http://127.0.0.1:8080/oauth2callback',
passReqToCallback: true
},
function(request, accessToken, refreshToken, profile, done) {
var isEmail = false;
for (var i = profile.emails.length - 1; i >= 0; i--) {
if (_.endsWith(profile.emails[i].value, 'test.co.uk')) {
isEmail = true;
}
};
if (isEmail) {
// do user stuff
done(null, profile);
} else {
done(null, profile);
}
}
));
passport.serializeUser(function(user, done) {
console.log('serializing user.');
done(null, user.id);
});
passport.deserializeUser(function(user, done) {
console.log('deserialize user.');
done(null, user.id);
});
// connect to the database
massive.connect({
connectionString: config.postgres.conString
}, function(err, massiveInstance) {
db = massiveInstance;
done();
});
var google = passport.authenticate('google', {
scope: 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
});
var googleCallback = passport.authenticate('google');
var authenticate = passport.authenticate('google', {
successRedirect: '/success',
failureRedirect: '/fail'
})
// setup shceduler
var scheduler = require('node-schedule');
// return the appropriate method and objects.
return {
server: server,
db: db,
authenticate: authenticate,
google: google,
googleCallback: googleCallback,
scheduler: scheduler
}
};
module.exports = app这一切都很好,我最终在谷歌接受,然后当它达到这一点。
passport.serializeUser(function(user, done) {
console.log('serializing user.');
done(null, user.id);
});它登录到控制台,然后开始抛出节点对象。我很肯定这和做饭有关。
在如何调试方面,我有点不知所措。关于使用护照的信息不多。
发布于 2018-12-01 19:38:54
老问题,但请参阅我的答案here,以了解如何使用client-session与护照。
TL;DR:设置{cookieName: 'session'} (不是"Skyrail_session")并序列化整个用户对象,而不仅仅是ID。如果Passport不为您提供服务,您可能需要使用JSON.stringify()和JSON.parse()。
https://stackoverflow.com/questions/29869899
复制相似问题