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

18

我有多个跨越多个域的Web应用程序。我想实现单点登录,以便用户只需登录一次即可访问所有应用程序。

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

欢迎提供指向正确方向的通用指针。

2个回答

32
由于您的应用程序在不同的域上运行,因此无法在客户端机器上运行的这些应用程序之间共享cookie以验证用户。因此,某种信息需要在服务器端共享。
我想到的最简单的解决方案是:
1. 为所有服务器拥有一个共享会话。 2. 拥有特定的认证域并在需要进行身份验证时将用户重定向到该域。在那里验证用户并设置会话cookie或令牌(无论您想要哪种)。 3. 每当您的任何应用程序需要身份验证时,请将其重定向到身份验证域。身份验证cookie将被提供给身份验证域以及引荐域。在看到您已经通过验证后,认证服务器可以重定向您到具有适当sessionID 的原始应用程序,并将其设置为该域的cookie。 4. 如果未经过身份验证,则会要求用户在身份验证服务器上进行身份验证,然后进行重定向。 5. 通过进行一些小的更改,您可以使用令牌实现此目标,而无需共享会话。
在实施之前,请正确验证状态。您机制中的更多状态意味着更多的错误和可能的攻击机会。
考虑将您的应用程序移动到同一子域中。如果认证机制相同,则每个人都知道所有应用程序属于同一公司。人们也更容易记住同一域上的各种子域,而不是记住所有不同的域。

你会如何关闭所有网站的会话? - bryan-gc

2

最常用的项目是http://passportjs.org/,我几乎只使用它,它对企业解决方案(如 ADFS)和第三方解决方案(如 Google、Facebook)都有很好的连接器。


1
PassportJS能否用于实现自定义身份验证服务器,还是我们必须使用第三方身份验证? - RealZombs
@RealZombs 我会谨慎地实现您自己的身份验证服务器,但有一些本地插件可用,例如http://www.passportjs.org/packages/passport-local-token/。 - Peter Grainger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接