これらの機能を 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();
}
});
...そして、これが「remember me」機能を処理する私のバージョンのミドルウェアです。ただし、これをどうにかして 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() );
それが何らかの形で役立つことを願っています。それを理解するのに数時間かかりました。これが最善の方法であるかどうかはわかりませんが、今のところうまくいきます.