如何在同一域中的 2 个 Web 应用程序之间实现 SSO

How to implement SSO between 2 web apps on the same domain

我有两个完全独立的网络应用程序:

www.example.com (node.js)

www.example.com/shop (java)

用户登录 www.example.com,当他们访问 /shop 时,我希望该 Web 应用能够识别用户,而无需他们再次登录。

我有一个 OAuth2 public api,并且正在使用 cookie 来管理网络应用程序中的用户会话。我正在尝试找出在这两个网络应用程序之间实现 SSO 的最佳方式。

/shop 网络应用可以读取 cookie,但无权访问实际会话存储。 /shop 应用程序无论如何都需要进行 api 调用,所以如果我可以使用 OAuth2 来实现 SSO,那似乎是理想的。

有什么建议吗?

两者正交​​。 SSO 就是凭据共享。

由于您已经拥有 cookie,因此在他们之间共享,并且可以让他们进入这两个应用程序。只需在 cookie 中编码您想在他们之间共享的有趣信息(特别是用户 ID,可能还有任何相关角色)。

理想情况下,您要做的是使用共享 cookie 进行身份验证,然后当您的 /shop 网络应用程序启动其 OWN 会话时(即共享 cookie 与您的会话 cookie 不同),您建立了一个内部安全机制某种背景。从表面上看,您将从 cookie 中提取用户 ID,然后在您的公共用户存储中查找它以获取适当的信息。

这将适用于 99% 的用例。

所以您的工作流程是,当用户点击您的 /shop 应用程序时。

  • 检查共享 cookie
  • 如果不存在,将他们重定向到主应用程序进行登录
  • 如果确实存在,请检查您是否启动了此实例的有效会话
  • 如果没有,则启动会话,根据cookie中的ID查找用户信息(用户名、角色、偏好)。这些你可以存储在会话中
  • 去购物

注销只会破坏共享 cookie。

  • 检查共享 cookie。
  • 如果没有共享 cookie,检查会话
  • 如果会话存在,销毁它

哦,一旦他们登录,别忘了在您的共享 cookie 上签名。

没有理由让 OAuth 参与其中。太复杂了。