如何使用 NodeJS 进行单点登录?

How to do single sign-on with NodeJS?

我有多个网络应用 运行 跨多个域。我想实现单点登录,以便用户登录一次即可访问所有应用程序。

我该如何实施?所有应用程序都使用 NodeJS 后端。

欢迎指点正确方向。

最常用的项目是 http://passportjs.org/,这几乎是我唯一使用的项目,它与本地解决方案(如 ADFS)和第三方解决方案(如 google、facebook)的连接器非常好。

由于您的应用 运行 位于不同域,因此您无法在客户端计算机上的这些应用 运行 之间共享 cookie 来验证用户。所以需要在服务器端以某种方式共享信息。

我想到的最简单的解决方案是:

  1. 为所有服务器创建一个共享会话。

  2. 有一个特定的身份验证域,并在需要身份验证时将用户重定向到那里。在那里对用户进行身份验证,并根据需要设置会话 cookie 或令牌。

  3. 每当您的任何应用程序需要身份验证时,将其重定向到身份验证域。身份验证 cookie 将提供给身份验证域和引用域。在看到您已经通过验证后,身份验证服务器可以将您重定向到具有适当 sessionID 的原始应用程序,该 sessionID 将被设置为该域的 cookie。

  4. 如果未通过身份验证,将要求用户在身份验证服务器上进行身份验证,然后将发生重定向。

  5. 稍作改动,您可以使用令牌实现此目的,而无需共享会话。

在实施之前正确验证状态。机制中的更多状态意味着更多的错误和可能的攻击机会。

考虑将您的应用移至同一子域。如果身份验证机制相同,那么每个人都知道所有应用程序都属于同一家公司。人们也更容易记住同一域中的各个子域,而不是记住所有不同的域。