23

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

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

问题:

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

2 回答 2

17

SSO 服务不需要 OAuth。

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

与其拥有 OAuth 所需的身份验证/授权服务器,不如在所有 API 中使用单一登录服务。OAuth 访问令牌与您需要的完全不同。

据我了解,您可以拥有类似于 OAuth 的方式,即您的服务器将令牌出售给应用程序。(我假设它是一个完全内部的系统,所以不能滥用令牌)。

所以基本上我的建议是:

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

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

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

于 2013-05-11T06:46:45.010 回答
5

Oauth supports multiple different kinds of flows. You can use the client crendentials flow from Oauth 2.0 to avoid asking the user to grant permission for every app (this is intended for the cases where you control both the server and the app or where you want to preauthorize certain apps). This post does a good job explaining everything: http://tatiyants.com/using-oauth-to-protect-internal-rest-api/

于 2016-02-01T23:38:49.917 回答