虽然我肯定希望在 passport.js 中看到这些功能,但它们还没有。
我创建了一个简单的随机令牌生成器以与 passport.js serilizeUser() 函数一起使用,并稍微修改了 Justen 的答案以满足我的需要。基本上,唯一的区别是如果没有设置“记住”选项,只要浏览器打开,会话就会持续。
这是我的带有随机访问令牌生成器的序列化程序。我正在使用 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(); // Run the function again - the token has to be unique!
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; // Rememeber 'me' for 30 days
} else {
req.session.cookie.expires = false;
}
}
next();
});
app.use( passport.initialize() );
app.use( passport.session() );
我希望这会有所帮助。我花了几个小时才弄清楚,我不太确定这是最好的方法,但它现在对我有用。