【问题标题】:Sails socket authorization (using passport)Sails 插座授权(使用护照)
【发布时间】:2017-08-03 14:05:46
【问题描述】:

我正在使用护照进行身份验证/授权以及本地策略和 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 中。相反,它在handshake._query 中可用,而sails 文档(here)声称应该在socket.handshake.query 下(但socket 甚至不存在于beforeConnect 中,默认函数占用空间为@987654332 @)

这些是错误吗?我错过了什么吗?

【问题讨论】:

    标签: node.js sockets sails.js passport.js


    【解决方案1】:

    在与一位 Sails 开发人员 (here, thanks sgress454) 讨论之后:

    1. 标头不会随初始连接请求一起发送。它是 socket.io 规范的一部分,而不是sails 本身的问题。使用最新版本的 socket.io 可能可以设置 transportOptions 但这还没有集成到 Sails 中(2017-04-02)。

    2. 任何查询参数都显示为 handshake 参数的 _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);
        });
    
    },
    

    我现在遇到自动重新连接问题 :-( see here )-:

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2018-03-18
      • 2017-12-22
      • 1970-01-01
      • 2018-02-19
      • 2019-08-13
      相关资源
      最近更新 更多