web-dev-qa-db-ja.com

パスポート、mongodb、expressとの永続的なセッション

アプリケーションで認証とセッションを処理するためにパスポートを使用しています。私は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リポジトリ(コードの実行に必要なすべてのコードを含む)

コードを含むベアボーンgithubリポジトリを作成しました ここ

ルートディレクトリにmongodb資格情報(mongodbURLとmongodbName)を使用してconf.jsファイルを作成し、npminstallとnodeapp.jsを実行して開始します。

ありがとう

19
forste

passport.session()は設定を行いません。Expressバージョン4.Xの時点では、session()を設定する必要があります。

app.use(session({
  cookie : {
    maxAge: 3600000 // see below
  },
  store : new MongoStore(...)
});
...
app.use(passport.session());

また、maxAgecookieのプロパティである必要があります)はDate引数を取りませんが、セッションが有効である必要があるミリ秒数だけです。

エクスプレスミドルウェアモジュールセッションの使用方法については、詳細をご覧ください ここ

29
robertklep