2013-05-15 14 views
6

私は(私はそういないsecure: true HTTPS接続を使用していないことに注意してください)のNode.jsの最新バージョンを使用してsession.socket.io、これは私がセッションを設定する方法ですよ:node.jsとsession.socket.ioの安全な認証?

app.configure(function() { 
    app.use(cookieParser); 
    app.use(express.session({ 
     signed: true, 
     store: sessionStore, 
     secret: 'SECRET', 
     cookie: { 
      maxAge: 24 * 60 * 60 * 1000, 
      httpOnly: true 
     } 
    })); 
}); 
var sessionSockets = new SessionSockets(io, sessionStore, cookieParser); 

// Later 
sessionSockets.on('connection', function(error, socket, session) { 
    // session could be used here to detect if user is logged in 

    // e.g. login: session.name = 'x'; session.save(); 
    // e.g. checkIfLoggedIn: if (session.name) return true; 
}); 

は私のコードです安全/正しいか、ユーザーが実際にログインしていることをどのように認証できるか? クライアント上のsidのクッキーを変更することは可能ですか(hereと記載されています)?

答えて

11

PassportJSのようなライブラリを使用してホイールを再発明することを避けることをおすすめします。 Socket.io hereでPassportJSを使用するためのモジュールがあります(私は現在これを使用したことはありませんが、現在私はすぐに必要なプロジェクトに取り組んでいます)。私はPassportJSを使いました。それはとても簡単です。私はこれをお勧めします。パスポート

var express = require('express'), 
routes = require('./routes'), 
api = require('./routes/api'), 
http = require('http'), 
path = require('path'), 
mysql = require('mysql'), 
passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy; 

//MySQL 

var sqlInfo = { 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'dbname' 
} 


global.client = mysql.createConnection(sqlInfo); 

client.connect(); 




var app = module.exports = express(); 




/** 
* Configuration 
*/ 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use(express.cookieParser("secret")); 
app.use(express.session({ 
    secret: 'keyboard cat' 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.use(app.router); 




passport.use(new LocalStrategy(

    function(username, password, done) { 

     return check_auth_user(username,password,done); 

    } 

    )); 


// development only 
if (app.get('env') === 'development') { 
    app.use(express.errorHandler()); 
} 

// production only 
if (app.get('env') === 'production') { 
// TODO 
} 



/** 
* routes start--------------------------------------------------------------- 
*/ 
// home page contain login form 
app.get('/home', function(reg, res){ 
    //check user session value, is logged in 
    if(req.user) 
     res.render('dash',{ 
      username: req.user['member_id']//req.user array contains serializeUser data 
     }); 
    else 
     res.render('index'); 

}); 

app.get('/logout', function(req, res){ 

    req.logout(); 
    res.redirect('/home'); 
}); 

//login form submit as post 

app.post('/login', 
    passport.authenticate('local', { 
     successRedirect: '/dashboard', 
     failureRedirect: '/home' 
    }) 
    ); 
//to project dashboard 
app.get('/dash',routes.dash); 
//to project dashboard 
app.get('/signup',routes.signup); 
//to project dashboard 

app.get('*', routes.index); 

/** 
* routes end--------------------------------------------------------------------- 
*/ 


/** 
* Start Server 
*/ 

http.createServer(app).listen(app.get('port'), function() { 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Click for more details with exampleを使用して

+0

安全な認証にはpassportJsが最適です、私の推奨はpassportJSと同じです – FLF

+0

socket.idをセッションIDとして使用するのはどうですか?それも実行可能ですか? –

+0

@HongZhou、私は分かりません。しかし、私はPassportが認証を本当に簡単にすることを知っています。パスポートとsocket.ioを使用するためのモジュールがあれば、明らかに他の誰かがそれを試してみて、それはうまくいくようです:) – kentcdodds

-3

ユーザー認証とセッションストレージ!。

12

私はこれが少し古いと知っていますが、@kentcdoddsがcookieを解析してストレージからセッションを取得する方法(たとえば、自分自身のpassport.socketioモジュール)に加えて、将来の読者のためにトークンベースのアプローチ。

この例では、かなり標準的なJSON Webトークンを使用しています。あなたは、クライアントのページにトークンを与える。この例ではJWTを返す認証エンドポイントを想像する必要があります。

var jwt = require('jsonwebtoken'); 
// other requires 

app.post('/login', function (req, res) { 

    // TODO: validate the actual user user 
    var profile = { 
    first_name: 'John', 
    last_name: 'Doe', 
    email: '[email protected]', 
    id: 123 
    }; 

    // we are sending the profile in the token 
    var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 }); 

    res.json({token: token}); 
}); 

次のように、あなたのsocket.ioサーバを設定することができます。

var socketioJwt = require('socketio-jwt'); 

var sio = socketIo.listen(server); 

sio.set('authorization', socketioJwt.authorize({ 
    secret: jwtSecret, 
    handshake: true 
})); 

sio.sockets 
    .on('connection', function (socket) { 
    console.log(socket.handshake.decoded_token.email, 'has joined'); 
    //socket.on('event'); 
    }); 

あなたが唯一の接続時に、それを添付する必要があり、クライアントからのようsocket.io-JWTミドルウェアは、クエリ文字列にトークンを期待:

var socket = io.connect('', { 
    query: 'token=' + token 
}); 

私はこのメタについてのより詳しい説明を書きましたodおよびクッキーhere

+0

申し訳ありませんが、ありがとう –

+0

正確に私が探していたもの: –

+0

@JoséF.Romanielloこの例では、あなたはまだパスポートを使いますか? – amcdnl

関連する問題