Node.js Sails套接字授权(使用passport)

Node.js Sails套接字授权(使用passport),node.js,sockets,sails.js,passport.js,Node.js,Sockets,Sails.js,Passport.js,我使用passport进行身份验证/授权以及本地策略和JWT 经过一些研究密集的谷歌搜索;我知道授权的最佳位置是使用策略,因为它既适用于常规HTTP请求,也适用于通过SailsSocket对象发送类似“虚拟”HTTP请求的套接字请求 我现在正试图弄清楚如何正确使用套接字,我看到了一个beforeConnect处理程序,它允许拒绝连接。虽然这没什么大不了的,因为我有一个阻止它获取数据的策略,但我希望能够拒绝连接——我认为这更健康,并且有什么理由允许未经授权的套接字连接 我只希望套接字在初始身份验证

我使用passport进行身份验证/授权以及本地策略和JWT

经过一些研究密集的谷歌搜索;我知道授权的最佳位置是使用策略,因为它既适用于常规HTTP请求,也适用于通过SailsSocket对象发送类似“虚拟”HTTP请求的套接字请求

我现在正试图弄清楚如何正确使用套接字,我看到了一个beforeConnect处理程序,它允许拒绝连接。虽然这没什么大不了的,因为我有一个阻止它获取数据的策略,但我希望能够拒绝连接——我认为这更健康,并且有什么理由允许未经授权的套接字连接

我只希望套接字在初始身份验证后连接,以便在套接字初始化中,我可以将头设置为包含JWT:

io.sails.url = connections.http.baseURL;

io.sails.headers = {
    'Authorization': 'Bearer ' + token
};

io.sails.useCORSRouteToGetCookie = false;

io.socket = io.sails.connect();
io.socket.on('...', someHandler);
这似乎工作得很好-套接字请求符合JWT策略,我在控制器方法中获得了一个req.user,用于套接字请求

我的问题是-我如何拒绝没有令牌的用户连接,我甚至应该这样做

当我在beforeConnect中中断时,在握手对象中看不到授权头

更新:此外,我现在尝试在连接时发送查询中的令牌:

io.socket = io.sails.connect({token: token});
这样,我就能在握手中看到标记。我希望它在handshake.query中,但它不存在。相反,它可以在握手中使用。\当sails文档声明应该在socket.handshake.query下时,它是可查询的,但在beforeConnect中甚至不存在socket,默认函数封装是beforeConnect:functionhandshake,cb


这些是虫子吗??我遗漏了什么吗?

以下是与一位sails开发者的讨论:

标头不会随初始连接请求一起发送。它是socket.io规范的一部分,与sails本身无关。最新版本的socket.io可能会设置传输选项,但这尚未集成到sails 2017-04-02中

任何查询参数都显示为握手参数的_query属性。这是目前没有正确记录。文件将在不久的将来更新

至于根本问题——我已经使用自己的代码实现了令牌验证,因为我找不到将passport.js集成到beforeConnect方法中的方法。在config/sockets.js中,我有如下内容:

beforeConnect: function(handshake, cb) {
    // `true` allows the connection
    // (`false` would reject the connection)

    var token = handshake._query ? handshake._query.token : null;

    CipherService.verifyToken(token, function verifyTokenResults(err, decoded, info) {
        if (err || !decoded) {
            if (err.name === "TokenExpiredError") {
                // token expired - user can't connect...
                return cb(null, false);
            } else {
                // some other error...
                return cb(err, false);
            }
        }

        // here you may want to do other verification, e.g. the user is active
        return cb(null, true);
    });

},
我现在有自动重新连接问题:-: