虽然我确实希望在passport.js中看到这些功能,但它们还没有出现。
我创建了一个简单的随机令牌生成器,用于与passport.js的serializeUser()函数一起使用,并稍微修改了Justen的答案以适应我的需求。基本上,唯一的区别是,如果未设置“remember”选项,则会话将持续到浏览器关闭。
这是我的序列化程序,其中包括随机访问令牌生成器。我正在使用Mongodb和Mongoose,但是该实现应该很好地转换到其他系统中。
基本上,我获取时间并将一个随机的16个字符的字符串附加到它后面。然后,在serializeUser()函数中,我检查是否没有其他用户具有相同的令牌(令牌应该是唯一的!)。
User.methods.generateRandomToken = function () {
var user = this,
chars = "_!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
token = new Date().getTime() + '_';
for ( var x = 0; x < 16; x++ ) {
var i = Math.floor( Math.random() * 62 );
token += chars.charAt( i );
}
return token;
};
这是序列化器:
passport.serializeUser( function ( user, done ) {
var createAccessToken = function () {
var token = user.generateRandomToken();
app.User.findOne( { accessToken: token }, function (err, existingUser) {
if (err) return done( err );
if (existingUser)
createAccessToken();
else {
user.set( 'accessToken', token );
user.save( function ( err ) {
if (err) return done( err );
return done( null, user.get('accessToken') );
})
}
});
};
if ( user._id ) {
createAccessToken();
}
});
这是处理“记住我”功能的中间件,以下是我的版本。不过,我更希望它能成为serializeUser函数或passport.js核心的一部分。
app.use( express.session( { secret: 'secret_key' } ) );
app.use( function (req, res, next) {
if ( req.method == 'POST' && req.url == '/login' ) {
if ( req.body.remember ) {
req.session.cookie.maxAge = 30*24*60*60*1000;
} else {
req.session.cookie.expires = false;
}
}
next();
});
app.use( passport.initialize() );
app.use( passport.session() );
我希望这样能对您有所帮助。我花了几个小时才弄清楚,我不确定这是否是最好的方法,但目前它对我有效。