node.js, socket.io - 网站架构

node.js, socket.io - Web site architecture

我有一个网站,我希望有一个用户系统,用户可以在其中 登录,无论他在网站的哪个位置。

使用 socket.io,我发现每个 HTML 页面都需要自己的 socket.io 连接。因此,每次用户离开一个 HTML 页面转到另一个页面时,他将断开第一个套接字并连接另一个。

保持这种联系的最佳方法是什么?我不希望用户在每个 HTML 页面上手动登录。我假设将登录数据作为 HTML 参数传递并使用这些参数自动登录到服务器是非常愚蠢的,但目前这是我能想到的唯一解决方案。

理想情况下,socket.io 会在整个站点上使用相同的套接字。

考虑到所有具有用户系统的网站都具有所需的功能,我认为我遗漏了一些东西。

这里有两点很重要:

  • 套接字重置和
  • 身份验证。

套接字断开连接

如果您离开页面,您将断开连接。时期。你不能改变它,如果你的页面是不同的,你的套接字每次都会重新连接。 解决此问题的一种方法是创建一个 SPA - 具有 angular 或 ember 等框架的单页应用程序。它基本上是客户端路由 - 捕捉您的点击并显示不同的 "pages" 而无需重新加载。除了保持套接字打开之外,您还可以获得不必重新加载所有共享资源、网络开销等的好处,这在移动设备上格外有益。

但你不必这样做。

身份验证

正如其他人所建议的那样,您的实际问题是您的身份验证机制做得不够。 即使您的套接字被重置,您的新套接字也需要重新验证。有图书馆可以做这项工作,或者你自己做。它可以是一些简单的事情,比如获取 cookie 或某种身份验证令牌,您在使用套接字连接发送的第一个身份验证中获得(如果存在)。然后根据这个值进行身份验证。

像这样设置身份验证后,您可以在常规调用和套接字调用之间共享身份验证,并在所有页面和页面重新加载时保持身份验证。