首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJs -在SocketIO中访问Passport会话的SocketIO

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

Stack Overflow用户
提问于 2014-05-12 02:50:09
回答 2查看 980关注 0票数 0

我正在编写一个NodeJS解决方案,它依赖于护照的授权和SocketIO。

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

我已经实现了Passport.socketio,以便从商店访问它。

代码语言:javascript
复制
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”访问用户的配置文件。

代码语言:javascript
复制
socket.on("callback", function(){
     console.log(socket.handshake.user); //Fetch Logged in user's Id
})

如果我试图阻止对套接字的访问,这将是完美的,但我希望它对每个连接都是开放的(不管是否有会话)。我只想能够访问他们的护照会话Id,如果他们是登录。

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

我希望Passport.socketio过火了,没有它我可以轻松地做到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-12 14:10:00

我喜欢这样的事实:张贴一个问题经常帮助你回答它!

fail方法接受4个参数数据、消息、错误、回调。

你可以在没有授权的情况下启动回电,并取得成功。

代码语言:javascript
复制
function onAuthorizeFail(data, message, error, accept){
    accept(null, true);
};
票数 0
EN

Stack Overflow用户

发布于 2014-05-12 14:26:38

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

代码语言:javascript
复制
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];
                });
            }
        });
    }
});

为了让请求处理程序知道配置,我通常以以下形式编写它们:

代码语言:javascript
复制
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下面的更多内容

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23600334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档