如何使用TOKENS使用express和socket.io进行身份验证,而不是使用COOKIES进行身份验证。

时间:2014-04-26 10:01:47

标签: node.js cookies socket.io token primus

我正在构建一个实时移动应用(本机),我有兴趣从用户登录屏幕启动应用,然后继续前进。

我想我需要带有socket.io(或sockjs)的Express + primus + passport.socketio + redis(不是100%确定我还需要redis)来构建我的后端。

Node.js placeholder

我甚至发现this step by step tutorial非常有帮助,我需要一步一步地制作一个安全的api。

我的问题是双重问题:

  1. 我如何调整此示例以使用TOKENS而不是Cookie(因为我构建的是原生移动应用而非浏览器网络应用)and its more secure according to this
  2. 如何使用socket.io绑定express - 换句话说,socket.io如何知道用户是否经过身份验证?
  3. 我欢迎任何意见或建议。

    谢谢。

1 个答案:

答案 0 :(得分:4)

首先,我会使用不同的websocket库而不是socket.io。 socket.io开发人员目前正在研究engine.io和socket.io似乎没有得到非常积极的维护。我经历过以下链接中描述的许多问题,因为搬到sockjs没有任何问题。

http://www.quora.com/Sock-js/What-are-the-pros-and-cons-of-socket-io-vs-sockjs?share=1 https://github.com/LearnBoost/socket.io/issues https://github.com/ether/etherpad-lite/issues/1798 http://baudehlo.com/2013/05/07/sockjs-multiple-channels-and-why-i-dumped-socket-io/

您可能必须在sockjs之上实现自己的自定义事件,但这非常简单。因为听起来你已经在使用redis了,所以实现房间和pub / sub也应该很容易。

以下是我们如何进行基于令牌的套接字身份验证。

  1. 首先,客户端向服务器发出HTTP请求以请求令牌。这通过快速中间件路由请求,使您可以轻松访问会话数据。您可以在此处与护照互动以访问其帐户或会话数据。如果用户已登录,则生成UUID并将其会话数据存储在redis中作为键/值对,其中键是UUID,值是其字符串化的会话/帐户数据。只将UUID发送回客户端。
  2. 当客户端首次创建websocket连接时,在套接字上设置一个标记为未经身份验证的标志。
  3. 当套接字上有消息时,请检查套接字是否已通过身份验证。如果没有,则检查消息中的令牌。如果它不存在则终止连接。如果是,则查询redis以获取由令牌键入的键/值对。如果redis返回任何数据,那么您现在拥有该用户的会话数据,并可以将其附加到套接字并将套接字标记为已通过身份验证。如果令牌中没有任何redis键入,则终止连接。
  4. 现在,当您对套接字执行任何操作时,您应该可以访问该用户的会话数据。