用于内部 REST 通信的 OAuth + spring 安全性
Posted
技术标签:
【中文标题】用于内部 REST 通信的 OAuth + spring 安全性【英文标题】:OAuth + spring security for internal REST communication 【发布时间】:2012-12-16 16:19:51 【问题描述】:设置
我们正在使用 Java 和 Spring 开发一个分布式应用程序,我们现有的客户端前端(包括自己的身份验证、数据库、帐户等)使用 REST调用以访问我们的新服务器以获取其他服务。我们希望通过 Oauth 保护这些资源。
访问权限应受角色或帐户的限制。但是,我们不希望客户端用户不必担心除了已经现有帐户之外的任何其他身份验证。同时,我们需要为第三方应用程序提供一种在通过某种服务器注册后从外部访问某些资源的方法(这就是我们首先分发的原因)。
所以我们在服务器端设置了 spring security 来提供应该用来限制对资源的访问的帐户。 用户应在客户端登录,然后只能访问分配给他的那些服务器资源。我们有某种注册过程,可以在客户端设置用户以访问服务器服务,因此我认为应该在那里完成任何帐户设置。
所以问题是
如何让客户端在无需用户登录其服务器端帐户的情况下获取受保护资源的访问令牌?
我如何在不需要任何用户输入的情况下设置服务器端帐户?
我的想法
这样不行
我想我要么告诉客户端在服务器端为该用户创建的新帐户(但是,我将如何选择和传达密码?)或将客户端帐户同步到服务器,并使用这些凭据针对服务器对客户端进行身份验证并生成访问令牌。但这能节省多少?此外,服务器的帐户具有更高的安全性(单向加密、加盐密码),我真的不想通过使用较少保存的客户端帐户来破坏这一点。
也许会这样?
也许要走的路是在第一次身份验证期间告诉服务器客户端帐户,在服务器端创建一个帐户,将生成的令牌存储在客户端,然后使用该令牌针对服务器对客户端进行身份验证对于每个后续请求..?对于每个请求,服务器是否能够通过该令牌使用其服务器端帐户登录客户端? 对于只能从客户端服务器访问的初始(两条腿?)握手,我需要一个特殊资源,对吧?
还有: OAuth 1 还是 2 哪个更适合这项任务?
我希望有人能理解我的问题并帮助我解决可能存在的误解和知识差距(我现在正在阅读 Oauth 和 Spring 安全文档,所以如果我想出更清晰的图片和从而更清楚地知道该怎么做)
感谢您的帮助!
【问题讨论】:
【参考方案1】:所以我们目前的状态是使用 OAuth2 主要是为了简单。我们还确信,它可能存在的与安全性相关的缺陷我们可以根据需要自行解决,并且将来很可能会由实施供应商或 IETF 解决。
为了处理 REST 服务器和 REST 客户端(都在我们的控制范围内)之间的通信,我们使用以前称为 2-legged 身份验证,现在是客户端凭据授予。我已经问了一些关于 SO 的问题,包括
我们目前的spring-security context setup client credentials flow in particular long lived tokens versus reauthentication的使用 以及如何limit REST access by HTTP method关于使用基于客户端的用户帐户对服务器进行身份验证,我们没有进一步了解。
现在我们像以前一样针对我们的旧客户端 Web 应用程序对用户进行身份验证,然后针对服务器 2-legged 对客户端进行身份验证。从理论上讲,这将允许任何用户使用客户端访问令牌访问任何资源,但现在这对我们来说没问题,所以我们不会在这条路上进一步调查。
不过,如果有人知道如何解决这个问题,我们会提出来,只是为了进一步加强安全性。所以,我将保留这个问题。
我目前的想法是在身份验证服务器上为每个用户注册一个新的客户端 ID,并使用生成的秘密,然后将它们同步回客户端服务器并使用这些 client_id /秘密组合来访问代表用户的资源通过在客户端凭据流中生成的 client_id。
对于我们最新的应用程序,我们将在 REST 服务器(身份验证提供程序)上存储帐户,并让用户登录该服务器,然后使用令牌按照规范的预期访问 REST 资源。
【讨论】:
再过两年,我会向您报告,我至今还没有找到更好的方法(或者更确切地说,是更安全的方法)。我打算使用 oauth 2.0 密码授权,而不是客户端凭据。没有客户端密码,只有我们传递的客户端 ID。漏洞在于,如果任何人获得了我们的 refresh_token,如果他们继续使用令牌来请求新令牌,他们基本上可以获得无限制的访问权限。不幸的是,这是我们的缺点,但我还没有找到防止它的方法。以上是关于用于内部 REST 通信的 OAuth + spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章
OAuth2 用于 REST API,紧耦合 SPA 作为唯一客户端
将 OAuth2 或 JWT 用于带有 Wordpress 后端(REST API)的移动应用程序