具有服务网关调用的 SSO 身份验证 angular 应用程序

SSO authentication angular application with service gateway call

我们有一个使用 Angular 构建的应用程序。并且应用程序触发后端 REST api 来显示数据。

问题是,

该应用程序使用 LDAP SSO 身份验证来验证用户(这是公司内部的应用程序,因此没有外部用户)

步骤是,

  1. 如果用户启动站点,它将重定向到 WebSec 登录,用户在其中提供用户名和密码进行身份验证(隐式流程)。

  2. 一旦身份验证成功,我们将从 WebSec 获取 JWT 访问令牌,该令牌将存储在会话存储中,并将用作后端服务的 "Bearer" 令牌。

  3. 后端服务有它的 WebSec 证书来验证这个 JWT 令牌,否则它将以身份验证错误响应。

对于前端 - 我们正在使用 Angular 对于后端 - 我们是 Java,Sprint 启动。

问题是,

  1. 这是用户身份验证的正确方法吗?
  2. 如果是这样,隐式流的安全性如何。参考:https://www.instagram.com/developer/authentication/ - 每个人都在推荐显式流(服务器端调用)。我们的 UI 应用程序在不同的服务器上维护,后端服务在不同的服务器上维护。

如果有人对此提供解决方案,我将不胜感激。

隐式流的问题在于 URL 中存在 JWT 令牌。隐式流程可以在你的 Front-end 或 Back-end 中实现,两者都不推荐,但在 Front-end 中实现它有更多的漏洞,这就是你正在尝试做的,如果我理解你的问题正确。

我会按以下方式实现它。

  1. 您的 Front-end 将重定向到 WebSec 登录
  2. 成功登录后,WebSec 将重定向到您的 Back-end
  3. Back-end 检索 JWT 令牌
  4. Back-end 创建一个 one-time 令牌并使用该 one-time 令牌
  5. 重定向到您的 Front-end
  6. Front-end 检索 one-time 令牌和 POST 令牌到 Back-end 检索 JWT 令牌

到目前为止我看到的最好的方法如下(我也有 运行 你描述的 MS 单点登录服务器),但我建议它像 Discord 那样做:

  1. 您的前端使用 redirect_linkapplication_id 重定向到 SSO 并声明请求
  2. 如果身份验证成功并且 application_id 已知,您的 SSO 将重定向到 redirect_link,但是随机创建 code=$myCode,可以是 JWT 或任何长字符串
  3. 您的前端将此代码发送到您的后端,然后您的后端询问 SSO 服务器这是否有效 code 并请求一个真实的身份验证承载令牌。
  4. 如果一切正常,您的前端从 您的 API
  5. 获取真实的身份验证令牌

如果这个链全部成功,您可以非常确定您的内部网络中的一切都很好。这对于公司内部来说是一个足够好的方法。

对于外部使用,您可以在第 1 步和第 2 步中提供安全密钥,SSO 必须为从前端生成的前端返回该密钥,以确保此重定向来自您的 SSO。

编辑:关于加密的更多细节:

您的 SSO 可能使用 HS512 加密代码,该代码将发送给客户端,稍后通过 API 再次发送给 SSO。在这个周期中,如果 SSO 可以解密并验证它并且 API 是一个 known/allowed 通信伙伴,那么你可以说所有方面都是可信的。