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

问题描述 投票:0回答:1

我在过去的日子里正在努力配置认证+授权系统以使用来自移动应用程序的REST API的可能方法。

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

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

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

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

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

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

谢谢

oauth-2.0 single-sign-on saml
1个回答
0
投票

这里的主要目标是通过最新的安全标准(OAuth 2.0和Open Id Connect)。SAML是不兼容Web /移动设备/ API的过时协议,不适合现代编码模型。

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

OPTION 1

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

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

OPTION 2

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

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

OPTION 3

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

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