75

nodejs + express.js アプリケーションで認証を処理するために、passport.js を使用します。mongodb からユーザーを取得する LocalStrategy をセットアップします

私の問題は、ノード サーバーを再起動するときにユーザーを再認証する必要があることです。私は積極的に開発しており、再起動するたびにログインしたくないので、これは問題です...(+ノードスーパーバイザーを使用しています)

ここに私のアプリのセットアップがあります:

app.configure(function(){
    app.use('/static', express.static(__dirname + '/static'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser());
    app.use(express.session({secret:'something'}));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

そして、セッションのシリアライズ設定:

passport.serializeUser(function(user, done) {
    done(null, user.email);
});

passport.deserializeUser(function(email, done) {
    User.findOne({email:email}, function(err, user) {
        done(err, user);
    });
});

connect-mongodb を使用して、ブログで提供されている解決策を試しました (リンクはもう存在しないため、リンクを削除しました) が成功しませんでした

app.use(express.session({
    secret:'something else',
    cookie: {maxAge: 60000 * 60 * 24 * 30}, // 30 days
        store: MongoDBStore({
        db: mongoose.connection.db
    })
}));

EDIT追加問題:1つの接続のみを行う必要があります(1つの接続限定mongohq無料サービスの使用)

EDIT 2ソリューション(エディションとして、私の評判は今のところ私の質問に答えるには低すぎます

これが、マングースが開始した接続を使用して、私が最終的に見つけた解決策です

app.use(express.session({
    secret:'awesome unicorns',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
        {db:mongoose.connection.db},
        function(err){
            console.log(err || 'connect-mongodb setup ok');
        })
}));
4

7 に答える 7

56

connect-mongoと呼ばれるオープンソースがあり、必要なことを正確に実行します-セッションデータをmongodbに保持します

使用例(mongoose開いている接続を再利用):

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/sess');
app.use(express.session({
    secret:'secret',
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(
    // Following lines of code doesn't work
    // with the connect-mongo version 1.2.1(2016-06-20).
    //    {db:mongoose.connection.db},
    //    function(err){
    //        console.log(err || 'connect-mongodb setup ok');
    //   }
    {mongooseConnection:mongoose.connection}
    )        
}));

ここで詳細を読むことができます: https://github.com/kcbanner/connect-mongo

于 2012-04-16T14:15:34.480 に答える
6

私は connect-mongo を次のように使用します:

var MongoStore = require('connect-mongo');

var sess_conf = {
  db: {
    db: mydb,
    host: localhost,
    collection: 'usersessions' // optional, default: sessions
  },
  secret: 'ioudrhgowiehgio'
};

 app.use(express.session({
    secret: sess_conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(sess_conf.db)
  }));


[...]

// Initialize Passport!  Also use passport.session() middleware, to support
  // persistent login sessions (recommended).
  app.use(passport.initialize());
  app.use(passport.session());
于 2012-04-15T21:33:22.930 に答える
5

これは、セッションに MemoryStore (デフォルト) を使用するためです。memory.js (Connect フレームワークの一部) の次のコードを見てください。

var MemoryStore = module.exports = function MemoryStore() {
  this.sessions = {};
};

そして、session.js (Express) からのこのスニペット

function session(options){
    /* some code */
    , store = options.store || new MemoryStore
    /* some code */
}

ここで、サーバーを再起動するたびに MemoryStore がリセットされることを理解する必要があります。データを保持するには、他のセッション ストアを使用する必要があります。自分で作成することもできますが (あまり難しくないはずです)、Redis (このライブラリを参照) を選択することをお勧めします (Express で十分にサポートされています)。

// 編集

Connect のドキュメントによると、 getsetおよびdestroyメソッドを実装すれば十分です。次のコードが機能するはずです。

customStore = {
    get : function(sid, callback) {
        // custom code, for example calling MongoDb
    },
    set : function(sid, session, callback) {
        // custom code
    },
    destroy : function(sid, callback) {
        // custom code
    }
}    

app.use(express.session({
    store: customStore
}));

セッションデータを保存するためにMongoDb(またはRedisのような非永続的なものを使用することをお勧めしますが、他のDb)の呼び出しを実装するだけです。アイデアをつかむために、他の実装のソース コードも読んでください。

于 2012-04-15T17:39:53.927 に答える
2

これは、経験豊富なノード ユーザーにはおそらく明らかですが、私は気付きました。

ノードセッションを設定する必要があります - 例えば

app.use(session({secret: "this_is_secret", store: ...}));

パスポートセッションを初期化する前- 例

app.use(passport.initialize());
app.use(passport.session());

Passport.session() を最初に呼び出すと、機能しません (警告も表示されません)。問題はユーザー関数のシリアル化/逆シリアル化と無駄な時間にあると思いました。

于 2014-09-22T13:59:48.170 に答える