【问题标题】:End user authentication for RESTful web servicesRESTful Web 服务的最终用户身份验证
【发布时间】:2013-12-30 17:01:41
【问题描述】:

我有一个面向内部的 RESTful Web 服务。有各种客户端应用程序使用该服务,客户端应用程序本身也有最终用户。 Web 服务需要根据最终用户身份对请求进行授权。

问题:这里验证最终用户的典型选项是什么?也就是说,我想验证用户,而不是客户端应用程序。 (我不介意验证客户端应用程序是否是该方案的一部分,但最终我需要知道最终用户是我认为的他或她。)

例如,一种可能的方案是拥有每个客户端的系统帐户,然后让客户端简单地声明用户的身份(例如,在 HTTP 请求标头中)。因此,我们对客户端应用程序进行身份验证并将用户身份验证委托给客户端。不过,我不认为这是一个非常强大的方案,因为它过于依赖于保持系统帐户凭据的机密性。我已经看到太多人们通过电子邮件发送系统帐户凭据的例子了,我对这种方法没有信心。

另一种方法可能是让客户端应用在用户登录后使用用户的凭据从 API 获取令牌,然后将该令牌用于后续 API 请求。这样,身份验证是特定于用户的,无需客户端应用程序使用用户名/密码凭据。

无论如何,我想更好地了解我应该在这里考虑的选项范围。

【问题讨论】:

    标签: web-services security rest authentication oauth


    【解决方案1】:

    您用“委托身份验证”描述的问题是真实存在的。这意味着使用其凭据的“客户端应用程序”可以访问整个用户数据。这种访问可以被恶意使用(例如“半可信”应用程序收集 api 数据)或疏忽(例如应用程序意外暴露直接对象引用漏洞 - https://www.owasp.org/index.php/Top_10_2010-A4-Insecure_Direct_Object_References

    可能最流行的“基于令牌”的方案是 OAuth2 (http://oauth.net/2/),以及许多网站选择继续使用的前身 OAuth。

    OAuth2 有许多角色:

    1. 资源所有者(您的情况下的用户)
    2. 资源服务器(您的 api)
    3. 客户端(你谈论的应用程序)
    4. 授权服务器(不清楚在您的案例中谁或什么将担任此角色)

    基本方案是资源所有者使用他们的凭据直接向授权服务器进行身份验证。然后询问他们是否要将某些信息(可能只是一个持久标识符,或您的 api 公开的信息的描述)授予某些客户端。当他们接受“验证码”时,会向客户端发送一个“验证码”,并使用该验证码(结合他们自己的凭据)接收“访问令牌”。然后可以使用此访问令牌对资源服务器进行身份验证(可以根据授权服务器检查其真实性)。

    通常的使用方式是授权服务器和资源服务器由同一个实体拥有和管理(例如 google 和 facebook 将担任此角色),然后独立管理客户端。

    该方案也可以在没有“明确授权”的情况下在组织内部使用,它至少可以在从 api 发布任何数据之前确认特定最终用户存在。

    【讨论】:

    • 这真的很有帮助。我考虑过 OAuth2,但认为这是一个糟糕的匹配,因为我在服务端有细粒度的 ACL,而且我看到的所有 OAuth2 示例都涉及授予粗粒度权限(例如,授予某某应用程序权限贴在你的墙上)。
    • 所以你的神奇搜索词是“范围”。 OAuth2 具有可扩展的范围机制,这意味着您可以添加非常精细的控件,但它依赖于您事先与授权服务器达成一致。在这种情况下,“授予”屏幕会询问他们是否愿意授予访问权限,例如基于“mothershoesize”范围的“你妈妈的鞋码”。当客户端重定向用户时,应用程序需要的范围被传递给授权服务器。
    • 我是否可以让客户端将令牌传递给 Web 服务,然后让 Web 服务将令牌解析给用户,然后应用任何 ACL?我并不是真的希望最终用户能够授予客户端应用程序访问某某数据的能力(我认为这是正常的 OAuth 用例)。相反,客户端作为最终用户向服务进行身份验证(例如,通过传递令牌),因此客户端可以执行允许该最终用户执行的任何服务。让我知道 OAuth2 是否仍然是这里的候选者。
    • 当然。如果您提前了解全部用户,那么您可以为某些功能应用标准的用户“白名单”。这实际上是使用 OAuth2 进行简单的旧身份验证(并且您将在您的服务中应用自定义授权)。
    • 好的菲尔,非常感谢先生。你给了我一个很好的方向。
    猜你喜欢
    • 2020-11-13
    • 2012-06-19
    • 2016-02-20
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2013-06-11
    • 2019-07-30
    • 2012-08-31
    相关资源
    最近更新 更多