Sails套接字授权(使用护照)

时间:2017-03-13 14:06:34

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

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

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

我现在正试图弄清楚如何正确使用套接字,并且我已经看到有一个允许拒绝连接的beforeConnect处理程序。虽然这不是什么大问题(因为我的政策会阻止它获取数据),但我希望能够拒绝连接 - 我认为它更健康,有什么理由允许非授权套接字连接。 / p>

我只想在初始身份验证后插入连接,以便在我的套接字初始化中我可以设置标头以包含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中可用,而风帆文档(here)是应位于socket.handshake.query下的声明(但socket甚至不存在于beforeConnect中并且默认函数的足迹是beforeConnect: function(handshake, cb)

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

1 个答案:

答案 0 :(得分:1)

与其中一个风帆开发者(here, thanks sgress454)讨论后:

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

  2. 任何查询参数都显示为_query参数的handshake属性。这(目前)没有正确记录。文档将在不久的将来更新。

  3. 至于根本问题 - 我使用自己的代码实现了令牌验证,因为我找不到将{。{}}方法中的passport.js集成的方法。在beforeConnect我有类似的内容:

    config/sockets.js

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