如何与快递和socket.ioauthentication与TOKENS而不是与COOKIES。

我正在构build一个实时移动应用程序(本机),我有兴趣从用户login屏幕启动应用程序,然后继续。

我想我需要Express + primus与socket.io(或sockjs)+ passport.socketio + redis(不是100%确定我需要redis)来build立我的后端。

Node.js占位符

我甚至发现这个一步一步的教程是非常有帮助的,它使我一步一步地做出一个安全的API。

我的问题是双重的:

  1. 我怎样才能调整这个例子来使用TOKENS而不是cookies(因为我正在构build一个原生的移动应用程序,而不是一个浏览器的networking应用程序), 并根据这个更安全 。
  2. 如何使用socket.io绑定express – 换句话说,socket.io如何知道用户是否被authentication?

我欢迎任何意见或build议。

谢谢。

首先,我将使用不同的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应该也很容易。

以下是我们如何执行基于令牌的套接字身份validation。

  1. 首先,客户端向服务器发出HTTP请求以请求令牌。 这通过快递中间件路由请求,并让您轻松访问会话数据。 这是您与护照交互访问其帐户或会话数据的地方。 如果用户已经login,那么生成一个UUID,并将其会话数据存储在redis中作为键/值对,其中键是UUID,值是它们串化的会话/帐户数据。 只能将UUID发送回客户端。
  2. 当客户端首先创build一个websocket连接时,在套接字上设置一个标记为未authentication的标志。
  3. 当一个消息进入套接字时,检查套接字是否被authentication。 如果不是的话,检查消息中的令牌。 如果不存在,则终止连接。 如果确实如此,则查询由令牌键入的键/值对的redis。 如果redis返回任何数据,那么你现在有该用户的会话数据,并可以将其附加到套接字并将套接字标记为已validation。 如果令牌键入的redis中没有任何内容,则终止连接。

现在,当您在套接字上执行任何操作时,您应该有权访问该用户的会话数据。