2013-02-26 6 views
6

目標私が何をしたいのかセッションはpassport.js

  • はソケット用のセッションを作成し、ユーザー
  • のためのセッションを作成します(socket.io
  • passport.jsを使用して、ログインセッションとsocketセッションを認証します。私はMongoStorepassport.socket.io npm'sをインストールしている

ノート

。私は質問

Iユーザーの sessionsocketセッションやカップルにそれらを格納するためのセットアップシステムにはどうすればよい


connect.sid)にログインしたユーザのcookieにログインし、設定することができますか?


コード

app.js

/* The usual express setup */ 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('./models/user.js'), 
    MongoStore = require('connect-mongo')(express); 

app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ 
    secret: 'chuck norris', 
    store: new MongoStore({db: User.name}, // the db's name 
     function(err) { 
      console.log(err || 'connect ok!'); 
     }) 
    })); 
    app.use(express.methodOverride()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 

app.js(パスポート部)

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    User.findOne({username: username}, function(err, user) { 
     if(!user) { 
     return done(null, false, {message: 'Incorrect Username!'}); 
     } 
     if(!user.validPassword(password)) { 
     return done(null, false, {message: 'Incorrect Password!'}); 
     } 
     return done(null, user); 
    }); 
    } 
)); 


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

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

app.post('/', 
    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/home/'+req.user.username); 
    }); 

app.js(socket.io一部)

io.set('authorization', passportSocket.authorize({ 
    key: 'connect.sid', 
    secret: 'chuck norris', 
    store: /* Not entirely sure what goes here */ 
    fail : function(data, accept) { accept(null, false); }, 
    success: function(data, accept) { accept(null, true); } 
})); 


io.sockets.on('connection', function(socket) { 
    console.log('User Connected: ' + socket.handshake.user.username); 
}); 

答えて

10

あなたは変数に新しいメモリー・ストーリーオブジェクトのインスタンスを格納し、表現し、ソケットがそうのようにioの両方にそれを渡します。 app.configureで、その後 (私たちは別の店舗を使用していることに注意してくださいが、理論的には、あなたがいる限り、あなたがコントロールをオフに渡すよう適切な方法を使用して保存するかは重要ではないはずです)...

var ... 
,MemoryStore = express.session.MemoryStore 
,sessionStore = new MemoryStore(); 

あなたは... socket.ioのconfigureインチ

app.use(express.session({store:sessionStore,secret:'secret',key:'express.sid'})); 

し、最終的に

io.configure(function(){ 
io.set("authorization", passportSocketIo.authorize({ 
    key: 'express.sid',  //the cookie where express (or connect) stores its session id. 
    secret: 'secret', //the session secret to parse the cookie 
    store: sessionStore,  //the session store that express uses 
    fail: function(data, accept) { 
     // console.log("failed"); 
     // console.log(data);// *optional* callbacks on success or fail 
     accept(null, false);    // second param takes boolean on whether or not to allow handshake 
    }, 
    success: function(data, accept) { 
     // console.log("success socket.io auth"); 
    // console.log(data); 
     accept(null, true); 
    } 
})); 

あなたはこれを正しく行っていると、ユーザーが正常にあなたがトンにアクセスすることができるはず認証した場合ハンドシェイクオブジェクト上のセッションデータ。

console.log(socket.handshake.user.username); 
//or sometimes it might be... 
console.log(socket.handshake.user[0].username); 

希望します。

+1

ありがとうございました。もう1つ、サーバーが再起動されると、ユーザーセッションが削除され、ページがログイン画面に戻ります。 – ashley

+0

もう1つ言うことは、あなたのセッションが削除されてログインに戻る理由に私が答える必要があるということですか? –

+1

私はそれが正しい行動だと思います。サーバーを再起動すると、新しいセッションがすべて開始されます。これは、再起動後に再認証し、認証後に新しいセッションIDが生成されるためです。サーバーの再起動後もセッションを維持したいと言っていますか? –

関連する問題