9

我正在为一组REST风格的Web应用程序的用户使用内部认证系统。我们的意图是,用户应该能够通过Web表单登录一次,并且可以适当地访问我们域中的所有这些RESTful应用程序,这些应用程序可能分布在许多服务器上的私有云中。 (我明白已经有一个单一的认证会话不符合纯粹的REST风格的方法,但这是一个可用性要求。)如何使用OpenID或OAuth进行内部第一方认证?

应用程序本身将用各种编程语言编写,所以语言中立的方法是需要。据我所知,我们可能会使用OpenID或OAuth或类似的框架来处理身份验证,但我的理解是,这些服务旨在用于第三方服务,而不是用于在我们的内部系统上共享数据的第一方服务。在这种情况下,我们可能会将所有其他应用程序视为第三方(或依赖方)的中央提供商服务。

问题:

  1. 是否适合认证中的第一方服务的OpenID/OAuth的?
  2. 如果是这样,建议如何为此用例设置身份验证?
  3. 用户是否必须授予他们想要使用的每个第一方服务器的个人权限,就像他们需要向任何第三方服务器授予个人权限一样?我认为这会违反访问所有第一方服务的单点登录要求。
  4. 有支持这个第一方用例的站点的好例子吗?
  5. 对于这个第一方用例,什么是一个好的替代框架?

回答

7

您不需要OAuth进行SSO服务。

如您所知,OAuth的主要用途/优势是授予对第三方应用程序的访问权限,以受控方式访问/使用您的资源。

您不需要拥有OAuth所需的认证/授权服务器,为什么不在所有API中使用单一登录服务。 OAuth访问令牌与您需要的完全不同。

据我所知,您可以拥有的东西就像OAuth一样,您的服务器将令牌分发给应用程序。 (我假设它是一个完全内部的系统,所以令牌不能被滥用)。

所以基本上我建议的是:

  1. 当应用程序试图访问它重定向到一个网络的形式第一API。
  2. 用户输入凭证并带到数据库进行验证。让服务为用户/应用程序生成令牌
  3. 下一个API访问请求将使用该令牌进行 - 令牌可以唯一标识应用程序
  4. 根据您需要的安全级别,您可以签署一些文本使用HMAC并将其作为令牌发送,或者其完全内部仅为应用/用户生成唯一标识符并将其发送给其他API在收到令牌后,每个服务首先使用令牌调用主服务器,并在内部获取相应的客户/用户ID并执行所需的功能。

简而言之,将登录+令牌生成+令牌验证分为不同的模块。所有API都应该使用此模块进行登录/令牌验证。

我在这里提出的工作方式与OAuth类似,但是因为您希望在私有云中使用它,所以所有安全方面都已被剥离。

+0

感谢您的确认。很高兴知道我没有在OAuth或其他第三方框架中遗漏明显的东西。 – Richard 2013-05-13 14:24:38

1

Oauth支持多种不同类型的流程。您可以使用Oauth 2.0中的客户端crendentials流程来避免要求用户授予每个应用程序的权限(这适用于您控制服务器和应用程序的情况,或者您想要预先授权某些应用程序的情况)。这篇文章很好地解释了一切:http://tatiyants.com/using-oauth-to-protect-internal-rest-api/

相关问题