NodeJs - 在SocketIO中访问Passport会话的UserId

时间:2014-05-12 02:50:09

标签: node.js mongodb socket.io passport.js

我正在编写一个NodeJS解决方案,该解决方案依赖Passport进行授权和SocketIO。

当访问套接字连接时,我希望能够获取存储在MongoDB中的用户会话/配置文件(如果有)。 (通过connect-mongo)。

我已经实施了Passport.socketio来从商店访问它。

io.set('authorization', passportSocketIo.authorize({
        passport: require('passport'),
        cookieParser: cookieParser,
        key:         'connect.sid',       
        secret:      'StackSecret',
        store:       new store({
            db: mongoose.connection.db,
            collection: 'sessions',
        }),

        fail:        FailedMethod
    }));

然后我可以从“socket.handshake.user”..

访问用户的个人资料
socket.on("callback", function(){
     console.log(socket.handshake.user); //Fetch Logged in user's Id
})

如果我试图阻止对套接字的访问,但是我希望它对每个连接开放(无论是否有会话),这都可以完美地工作。我只是希望能够在登录后访问他们的Passport会话ID。

从SocketIo访问会话userId的最佳方式是什么?

我希望Passport.socketio有点矫枉过正,如果没有它,我可以轻松完成。

2 个答案:

答案 0 :(得分:2)

您自己的答案可能就此情况而已,但您回答了一个更一般的问题(如何访问套接字连接的会话信息)。以下是我一般的做法。另外,我通常以这样的方式注册所有路由,以便获得对配置的引用,因此我还可以为每个请求处理程序提供特定于此特定会话的套接字连接:

var cookie = require("cookie"),
    parseSignedCookie = require('connect').utils.parseSignedCookie;

var io = require('socket.io').listen(httpServer);
io.sockets.on("connection", function(socket) {
    if (socket.handshake.headers.cookie) {
        var cks = cookie.parse(socket.handshake.headers.cookie);
        var sessionId = parseSignedCookie(cks["connect.sid"], config.sessionSecret);

        config.sessionStore.get(sessionId, function(err, session) {
            if (!err) {
                console.info("connected socket for ID " + sessionId);
                config[sessionId] = socket; // set socket to config so that request handlers could emit on it

                socket.on("disconnect", function() {
                    console.info("disconnected socket for ID " + sessionId);
                    delete config[sessionId];
                });
            }
        });
    }
});

为了让请求处理程序了解配置,我通常采用以下格式编写它们:

exports.get = function(conn, config) {
    return function(req, res, next) {
        var socket = config[request.sessionID];
        if (socket) {
            // socket.emit 
        }
        res.end();
    }
}

app.get("/", someModule.get(customConnection, config));

对于后者,请参阅https://github.com/codelab-io/node-route-dir

下的更多内容

答案 1 :(得分:0)

我喜欢这样一个事实:发布问题经常会帮助你回答它!

fail方法需要4个参数数据,消息,错误,回调。

您可以成功触发回叫,并且会在未经授权的情况下继续发送。

function onAuthorizeFail(data, message, error, accept){
    accept(null, true);
};