1

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

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

Node.js 占位符

我什至发现这个循序渐进的教程真的很有帮助,它需要我一步一步地制作一个安全的 api。

我的问题是双重的:

  1. 如何调整此示例以使用 TOKENS 而不是 cookie(因为我正在构建本机移动应用程序而不是浏览器 Web 应用程序)并且根据 this 更安全
  2. 如何将 express 与 socket.io 绑定 - 换句话说,socket.io 如何知道用户是否经过身份验证?

我欢迎任何意见或建议。

谢谢你。

4

1 回答 1

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 请求以请求令牌。这会通过 express 中间件路由请求,并让您轻松访问会话数据。您可以在此处与护照交互以访问他们的帐户或会话数据。如果用户已登录,则生成一个 UUID 并将他们的会话数据作为键/值对存储在 redis 中,其中键是 UUID,值是他们的字符串化会话/帐户数据。仅将 UUID 发送回客户端。
  2. 当客户端第一次创建 websocket 连接时,在套接字上设置一个标志,将其标记为未经身份验证。
  3. 当消息进入套接字时,检查套接字是否经过身份验证。如果不是,则检查消息中的令牌。如果它不存在,则终止连接。如果是,则查询 redis 以获取由令牌键入的键/值对。如果 redis 返回任何数据,那么您现在拥有该用户的会话数据,并且可以将其附加到套接字并将套接字标记为已验证。如果令牌键入的 redis 中没有任何内容,则终止连接。

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

于 2014-04-26T17:49:11.993 回答