如何使用OpenID或OAuth进行内部第一方身份验证?

26

我正在为一组 RESTful web 应用程序的用户开发一个内部认证系统。我们的意图是,用户应该能够通过 Web 表单进行一次登录,并且可以访问我们域中所有这些 RESTful 应用程序,这些应用程序可能分布在私有云上的许多服务器上。(我已经了解到,拥有单个经过身份验证的会话与纯 RESTful 方法不符,但这是可用性要求。)

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

问题:

  1. OpenID/OAuth 是否适用于第一方服务之间的身份验证?
  2. 如果是,如何建议设置此用例的身份验证?
  3. 用户是否需要向每个想要使用的第一方服务器授予权限,就像他们需要向任何第三方服务器授予权限一样?我认为这将违反具有访问所有第一方服务的单个登录的要求。
  4. 有哪些支持此第一方使用案例的良好示例站点?
  5. 对于这种第一方使用情况,有哪些良好的替代框架?

答案:
  1. OpenID/OAuth 适用于第一方服务之间的身份验证吗?
  2. 是的,可以使用 OpenID 或 OAuth 来进行第一方服务之间的身份验证。

  3. 如果是,如何建议设置此用例的身份验证?
  4. 一个中央提供者服务可以被用作身份提供者,并且所有其它应用程序都将被视为依赖方。当用户首次登录时,中央提供者将颁发一个令牌,该令牌将被用于访问所有需要身份认证的应用程序。

  5. 用户是否需要向每个想要使用的第一方服务器授予权限,就像他们需要向任何第三方服务器授予权限一样?我认为这将违反具有访问所有第一方服务的单个登录的要求。
  6. 不需要。在中央提供者服务上进行一次登录后,用户将可以访问所有需要身份验证的应用程序,而无需向每个应用程序授予权限。

  7. 有哪些支持此第一方使用案例的良好示例站点?
  8. 许多大型组织和企业都在内部使用类似的身份验证系统。例如,谷歌、亚马逊和微软等公司都有类似的解决方案。

  9. 对于这种第一方使用情况,有哪些良好的替代框架?
  10. 除了 OpenID 和 OAuth 之外,还有其他身份验证框架可用于第一方服务之间的身份验证,例如 SAML 和 JWT。

2个回答

18

对于SSO服务,您无需使用OAuth。

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

与您需要 OAuth 的身份验证/授权服务器不同,为什么不使用跨所有 API 的单个登录服务。OAuth 访问令牌与您需要的完全不同。

据我所知,您可以以某种方式拥有类似 OAuth 的东西,即服务器提供令牌给应用程序。(假设这是一个完全内部系统,因此令牌不能被滥用)。

因此,我提出的基本概念是:

  1. 当应用程序尝试访问第一个 API 时,它会被重定向到 Web 表单。
  2. 用户输入凭据并进入 DB 进行验证。让一个服务为用户/应用程序生成令牌
  3. 下一个 API 访问请求将使用该令牌 - 令牌唯一标识应用程序
  4. 根据您所需的安全级别,您可以使用 HMAC 对一些文本进行签名,并将其作为令牌发送,或者如果它完全是内部的,则为应用程序/用户生成唯一标识符,并将其发送到其他 API
  5. 在接收到令牌后,每个服务首先使用令牌调用主服务器并内部获取相应的客户/用户 ID 并执行所需功能。

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

我在这里提出的方案类似于 OAuth,但由于您想在私有云中使用它,因此已剥离了所有安全方面。


感谢确认。知道我在OAuth或其他第三方框架方面没有错过明显的东西是很好的。 - Richard

7

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


2
这不是滥用OAuth吗? - Konrad
我认为可能是误用,客户端凭据已被弃用。Spring OAuth服务器决定甚至不包括此流程。 - Georgian Benetatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接