アプリケーションで認証とセッションを処理するためにパスポートを使用しています。私はmongostoreを使用してmongodbへのセッションを永続化しています。
セットアップは一般的に正常に機能します。ただし、サーバーを再起動すると、すべてのユーザーがログアウトされるため、セッションはmongodbにのみ保持されるのではなく、メモリに保持されているようです。サーバーを再起動したときにユーザーがまだログインしているセットアップを実現しようとしています。
基本構成は以下の通りです
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session({
maxAge: new Date(Date.now() + 3600000),
store: new MongoStore(
{
db: mongodb.Db(
conf.mongodbName,
new mongodb.Server(
'localhost',
27017,
{
auto_reconnect: true,
native_parser: true
}
),
{
journal: true
}
)
},
function(error) {
if(error) {
return console.error('Failed connecting mongostore for storing session data. %s', error.stack);
}
return console.log('Connected mongostore for storing session data');
}
)
}));
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done) {
console.log('user %s attempting to authenticated', email);
return User.findOne({email:email}, function(error, user) {
if(error) {
console.error('Failed saving user %s. %s', user.id, error.stack);
return done(error);
}
if(!user) {
return done(null, false);
}
console.log('user %s logged in successfully', user.id);
return done(null, { //passed to callback of passport.serializeUser
id : user.id
});
});
}
));
passport.serializeUser(function(user, done) {
return done(null, user.id); //this is the 'user' property saved in req.session.passport.user
});
passport.deserializeUser(function (id, done) {
return User.findOne({ id: id }, function (error, user) {
return done(error, user);
});
});
コードを含むベアボーンgithubリポジトリを作成しました ここ
ルートディレクトリにmongodb資格情報(mongodbURLとmongodbName)を使用してconf.jsファイルを作成し、npminstallとnodeapp.jsを実行して開始します。
ありがとう
passport.session()
は設定を行いません。Expressバージョン4.Xの時点では、session()
を設定する必要があります。
app.use(session({
cookie : {
maxAge: 3600000 // see below
},
store : new MongoStore(...)
});
...
app.use(passport.session());
また、maxAge
(cookie
のプロパティである必要があります)はDate
引数を取りませんが、セッションが有効である必要があるミリ秒数だけです。
エクスプレスミドルウェアモジュールセッションの使用方法については、詳細をご覧ください ここ 。