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

时间:2019-12-24 18:48:45

标签: oauth-2.0 single-sign-on saml

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

场景: 我们已经为服务多个用户的大客户开发了3个独立的门户。 为了为3个门户启用SSO,我们已经使用SimpleSAMLphp实现了SAML身份验证系统。 每个门户网站都有一个服务提供商,并且它们针对中央IdP发出断言请求。 IdP将对照在注册过程中密码被散列和存储的数据库检查用户名和密码。 登录后,门户网站上的授权由服务器上的会话处理,到目前为止一切正常。

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

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

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

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

我希望一切都清楚了,任何帮助将不胜感激!

谢谢

1 个答案:

答案 0 :(得分:0)

此处的主要目标是通过 最新的安全标准(OAuth 2.0和Open Id Connect)。 SAML是一种过时的协议,不支持Web /移动设备/ API,并且不适合现代编码模型。

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

选项1

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

  • 移动或Web UI使用授权流(PKCE)并重定向到授权服务器以使用户登录
  • 移动或Web UI登录后会收到访问令牌,该令牌可以发送给API
  • 访问令牌格式最常见的是一种JWT,API可以通过该JWT验证并标识用户
  • 该API不参与登录或令牌发行过程

选项2

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

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

选项3

使用桥接解决方案(不建议这样做,但有时如果您没有适当的授权服务器,则值得考虑-至少它使用OAuth令牌获取您的应用):

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