如何使用spring-security-oauth2支持使用应用程序可配置的身份验证提供程序

时间:2015-01-02 22:44:58

标签: spring authentication spring-security-oauth2

在原型设计API& SDK,我用几个合理的解决方案遇到了这个问题。我正在寻找一些高级架构的帮助。简而言之,可以保证API的一些消费应用程序将要配置自己的身份验证提供程序。

我一直在咀嚼的选项:

  1. 保持资源服务器和授权的耦合,但要找出一些方法将身份验证提供程序中的一个身份验证提供程序中的身份验证委派给客户端应用程序。
  2. 这听起来很有希望,直到我意识到在特定用例中,即使我提供的应用程序也不需要知道用户的凭据。

    1. 分离资源服务器并使每个使用应用程序负责提供授权服务器,并在向资源提供程序注册使用应用程序时将这些端点设置为配置的一部分。
    2. 当使用authorization_code授权类型时,这感觉就像经常需要的反转一样令人不舒服。它还需要每个消费应用程序实现任何“默认”授权提供程序。

      1. 某种委派授权服务器,如果客户端没有为自己的授权服务器提供端点,则会回退到默认服务器。
      2. 这可能是一个很好的解决方案,但我不知道如何使用“spring-security-oauth2”方式,或者如果我必须实现一堆我自己的东西。

        1. 创建默认的auth服务器,并可选择允许使用应用程序指向他们想要的任何auth服务器。
        2. 这似乎是可行的方法,因为它提供了大量的自定义。我担心的是,如何对资源服务器强制执行某种注册表?如果auth服务器是批准使用应用程序的服务器,但我不想让任何消费应用程序实现自己的auth服务器,只是其中一些。否则,不受信任的客户可能最终批准自己了!?

          如果这会影响任何指导,我的资源提供程序将需要一个完全虚增的OAuth2Authentication对象(其中包含用户详细信息和客户端详细信息)。

          这张图片主要解释了我在说什么,除了我想要多个授权服务器,并希望将它留给消费应用程序来决定指向哪个授权服务器。如何在资源服务器端检查代理请求的授权服务器是批准的授权服务器?

          le image

          附录:

          我看了一下用于此自定义身份验证案例的现有实现,我想我们只是在他们的会话中读取一个令牌,该令牌由他们自己的登录服务设置,并且每次都会建立他们的用户。这种自定义是一个问题,因为我们从提供者方面删除了自定义,而有利于在使用应用程序中处理它们。因此,我正在寻找解决方案,因此消费应用程序可以定义自己的身份验证方式,甚至为用户提供提供应用程序不会持久化(这使我认为它可能需要是一个完整的auth服务器)。

          话虽这么说,这似乎是一个潜在的不可持续的倒置模型(恕我直言,提供者应该是用户和授权的维护者,而不是消费应用程序)。所以,我可能会建议更多面向业务的变革。

1 个答案:

答案 0 :(得分:0)

我相信我终于想出了一种安全且可维护的方法来解决这个问题。

  1. 让使用应用程序选择性地向授权服务器注册身份验证回调。
  2. 要求代表用户从该应用程序向授权服务器发送传入的授权请求以包含令牌,该令牌应由消费应用程序存储,作为引用任何用户主动引起API调用的方式。
  3. 当授权服务器从已注册其中一个回调的应用程序收到授权代码请求时,请POST到该应用程序的已注册身份验证回调,并在请求中包含消费应用程序提供的令牌。
  4. 使用应用程序应该将已发布的令牌发送到其注册的身份验证回调并查找相应的用户,并返回包含提供应用程序应该代表其运行的完整用户对象的响应(或者某种错误代码,如果令牌无效)。
  5. 然后,授权服务器应生成授权代码并返回使用授权代码请求提交的回调uri。这意味着我们将按照原始问题中图表中的步骤4重新回到正轨。其余步骤可以按原样进行。
  6. 还有一个问题是如何实现这一点,以尽可能多地利用spring-security-oauth2框架,同时仍然实现此扩展。