3

socket.ioを使用して WebSocket 接続を認証しようとしています。

私の Web ソケットは、ブラウザーと Python または Node.js クライアントの両方から接続を受け取ることができます。

最初のケース (ブラウザー) では、ユーザーはExpress.jsサーバーによって認証され、セッション cookieを使用するだけなので問題ありません。

ただし、2 番目のケース (ランダム クライアント) では、認証を自分で処理する必要があります。

socket.io のドキュメントから、ハンドシェイク フェーズで接続を承認するためのフックがあることがわかりました。ただし、クライアントがカスタム ヘッダーを追加する方法はないようです。カスタム データを追加する唯一の方法は、url クエリ文字列にあるようです。

URLはログに記録されることが一般的であるため、これは本当に安全ではないように思われるため、資格情報もログに記録されます。

また、ハンドシェイク中でも接続が安全なのか、それともハンドシェイクがsslを介していない場合、そのようにするのはセキュリティ上の大きな問題なのか疑問に思っています。

まあ...基本的にセキュリティの問題です。誰かがそれを行う正しい方法を知っていますか? 本当に資格情報を URL に入れる必要がありますか?それは安全ですか?

4

3 に答える 3

0

このような取り組みを行うには、expressIDをsocketIO接続のsessionIDにフックする必要があります。Express 3の場合、これはまったく別の話であり、通常はそれほど簡単ではありません。数ヶ月前に、私はそうする方法を見つけました。

//directories
var application_root = __dirname,

//general require
var express = require('express'),
 connect = require('connect'),
 http = require('http');

//create express app
var app = express();

//create sessionStore
var sessionStore = new connect.session.MemoryStore();

//setup sessionKey
var secretKey = 'superdupersecret';


//configure express
app.configure(function() {

    //use body parser
    app.use(express.bodyParser());

    //override methods
    app.use(express.methodOverride());

    //cookies and sessions
    app.use(express.cookieParser(secretKey));
    app.use(express.session({
        store: sessionStore,
        secret: secretKey,
        key: 'express.sid'
    }));

    //router
    app.use(app.router);
});

//create the http server link to the new data http object of express 3
server = http.createServer(app);

//make server listen to 8080 and localhost requests
server.listen(8080, 'localhost', function() {
    console.log('Express Server running and listening');
});

//bind socket.io to express server by listening to the http server object
var io = require('socket.io').listen(server);

//set the authorization through cookies 
io.set('authorization', function(data, accept) {

//check if header data is given from the user
if (!data.headers.cookie) {

        //return false if no cookie was given
        return accept('Session cookie required!', false);
    }

    //parse cookie into object using the connect method
    //NOTE: this line is a hack, this is due to the fact
    //that the connect.utils.parseCookie has been removed
    //from the current connect module and moved to an own
    //instance called 'cookie'.
    data.cookie = connect.utils.parseSignedCookies(require('cookie').parse(decodeURIComponent(data.headers.cookie)), secretKey);

    //save session id based on exress.sid
    data.sessionID = data.cookie['express.sid'];

    //get associated session for this id
    sessionStore.get(data.sessionID, function(err, session) {
        if (err) {
            //there was an error
            return accept('Error in session store.', false)
        } else if (!session) {
            //session has not been found
            return accept('Session not found', false);
        }

        //successfully got the session, authed with known session
        data.session = session;

        //return the accepted connection
        return accept(null, true);
    });

});

//connection handler for new io socket connections
io.sockets.on('connection', function(socket) {

    //parse handshake from socket to io
    var hs = socket.handshake;

    //show session information
    console.log('New socket connection with sessionID ' + hs.sessionID + ' connected');

});

//handle user disconnect and clear interval
io.sockets.on('disconnect', function() {

    //show disconnect from session
    console.log('Socket connection with sessionID ' + hs.sessionID + ' disconnected');

});
于 2012-11-14T20:55:47.353 に答える
0

したがって、唯一の解決策は、URL クエリ文字列に認証データを追加することです。他の可能性を許可するオープン チケットがありますが、開発者はクエリ文字列のみを使用する方向に傾いているようです。

于 2012-11-21T18:44:23.917 に答える
0

これは私にとってはうまくいきます: https://gist.github.com/jfromaniello/4087861。Cookieヘッダーを設定できるxmlhttprequestバージョン1.5.0を使用するには、socket.io-client package.jsonを変更する必要がありました。また、socket.io xmlhttprequest を使用するには、両方の要件を変更する必要がありました。

require('socket.io-client/node_modules/xmlhttprequest') 

それ以外の

require ('xmlhttprequest');
于 2013-02-07T19:47:13.730 に答える