我使用护照进行身份验证/授权以及本地策略和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)
)
这些错误吗?我错过了什么吗?
答案 0 :(得分:1)
与其中一个风帆开发者(here, thanks sgress454)讨论后:
标头不会与初始连接请求一起发送。它是socket.io规范的一部分,而不是sails本身的问题。最新版本的socket.io可以设置transportOptions
,但这还没有集成到风帆中(2017-04-02)。
任何查询参数都显示为_query
参数的handshake
属性。这(目前)没有正确记录。文档将在不久的将来更新。
至于根本问题 - 我使用自己的代码实现了令牌验证,因为我找不到将{。{}}方法中的passport.js集成的方法。在beforeConnect
我有类似的内容:
config/sockets.js
我现在有自动重新连接问题:-(see here) - :