在 SAML 身份验证后使用 JWT 授权 REST API 请求

Using JWT to authorize REST API requests after SAML Authentication

这些天我正在努力寻找配置身份验证 + 授权系统以从移动应用程序使用 REST API 的可能方法。

场景: 我们为服务多个用户的大客户开发了 3 个独立的门户。 为了为 3 个门户启用 SSO,我们使用 SimpleSAMLphp 实现了 SAML 身份验证系统。 每个门户网站都有一个服务提供商,他们向中央 IdP 发出断言请求。 IdP 根据数据库检查用户名和密码,该数据库在注册期间对密码进行哈希处理和存储。 登录后,门户上的授权由服务器上的会话处理,到目前为止一切正常。

现在客户要求我们开发一个移动应用程序,要求用户登录并访问在使用 3 个门户网站期间收集的一些受保护资源。

我们决定使用 ionic 开发一个前端应用程序,该应用程序将使用 node.js 中制作的 REST API,为所有数据(受保护和未受保护的资源)提供服务。

现在问题来了:要授权访问 Api 上受保护的资源,我们想使用 JWT 轻松实现无状态系统。 疑惑是如何进行认证?我们有机会跳过 SAML 过程直接针对数据库检查凭据,否则我们必须实施一个解决方案,其中 SSO IdP 充当身份验证提供者,然后当尝试成功时,API 应用程序将获得来自 idp 的响应,然后向消费者客户端发出签名的 jwt。这第二种方式是常见的实现方式吗?可能吗?

你建议走哪条路?第一个可能很容易实现,但由于我们在应用程序的前端使用 html+js,如果我们决定可能在不久的将来使用第二个解决方案,我们可以从应用程序中回收一些代码以实现现代化门户网站上的一些功能,维护 jwt 模式并在网络上使用新的 Api。 我相信在这种情况下,使用门户会话中已经登录的用户数据,向新 api 请求令牌会更容易。听起来可能吗?

我希望一切都清楚,我们将不胜感激!

谢谢

这里的主要目标是以最佳方式编写您的应用程序代码,通过 最新的安全标准(OAuth 2.0 和 Open Id Connect)。 SAML 是一种过时的协议,对网络/移动/API 不友好,不适合现代编码模型。

听起来您想执行 OAuth,但您没有 OAuth 授权服务器,这是解决方案的关键部分。如果您可以迁移到一个应用程序,您将拥有未来最好的应用程序选择。

选项 1

使用最标准和最简单的选项 - 但用户必须使用新的登录屏幕 + 凭据登录:

  • 移动设备或 Web UI 使用授权流程 (PKCE) 并重定向到授权服务器以使用户登录
  • 移动设备或 Web UI 在登录后收到访问令牌,可以将其发送到 API
  • 访问令牌格式最常见的是 JWT,API 可以从中验证和识别用户
  • API 不参与登录或令牌颁发过程

选项 2

扩展选项 1 以联合到您的 SAML 身份提供商 - 使用户能够以现有方式登录:

  • 授权服务器配置为信任基于 SAML 的身份提供者并在登录期间重定向到它
  • SAML idp 显示登录屏幕,然后将 SAML 令牌发布到授权服务器
  • 授权服务器根据 SAML 令牌详细信息颁发基于 OAuth 的令牌

选项 3

使用桥接解决方案(不推荐但有时值得考虑,如果你没有合适的授权服务器 - 至少它让你的应用程序使用 OAuth 令牌):

  • 移动设备或 Web UI 使用资源所有者密码授予并将凭据发送到您开发的新 OAuth 端点
  • OAuth 端点提供了一个 /oauth/token 端点来接收请求
  • OAuth 端点根据数据库检查凭据 - 或转换为转发给 IDP 的 SAML 请求
  • OAuth 端点通过第三方库自行发布 JWT 访问令牌(如果凭据有效)
  • Web 或移动设备 UI 将 JWT 访问令牌发送到 API
  • API 验证收到的 JWT 访问令牌