【问题标题】:Multiple authentication levels in a RESTful APIRESTful API 中的多个身份验证级别
【发布时间】:2016-02-10 06:57:39
【问题描述】:

场景

我们正在为我们的 Web 应用程序构建一个新的 RESTful API。此 API 将为我们的移动应用程序、我们的网络应用程序和授权客户提供服务。

我们正在使用 Apigility 构建 API,并正在使用它提供的 OAuth2 实现。

目前,我们的 Web 应用程序依赖于 users 表,并为每个用户分配了权限。这些用户只需使用 Web 表单登录,然后存储会话并在访问时检查适当的权限。

我们希望能够对 API 访问(例如我们的网络应用和授权客户)进行身份验证,因此不会发生对 API 的未经授权的访问。但是,我们还想在用户级别授权权限,因此也必须进行某种用户身份验证。

对 API 的任何授权访问都可能使用不同的用户,因此依赖每个客户端的单个用户是行不通的,特别是因为权限是基于每个用户的。我们也不希望任何用户能够在没有事先身份验证的情况下使用 API,因此希望避免将每个用户都作为客户端添加到 OAuth2。

例如:

Web 应用程序通过 API 进行身份验证,有两个用户使用它:

UserA拥有用户管理权限

UserB没有用户管理权限

因此,UserA 可以从POST/users 并接收200 OK,而UserB 应该接收403 Forbidden

我们尝试过的

我们已经创建了一个示例应用程序,并且已经成功地为高级客户端设置了使用 OAuth2 的身份验证,并且可以按预期进行调用。但是我们还不能基于此为我们的用户创建授权模型。

我们添加了一个带有用户令牌的自定义 HTTP 标头,该用户令牌是在对 /user/login 的经过身份验证的调用之后提供的。但我们不确定这是否是正确的方法。

问题

我们如何既验证高级客户端(例如我们的网络应用程序或授权客户),又根据实际使用系统的用户授权访问?

【问题讨论】:

  • 你是怎么解决这个问题的?

标签: api rest authentication oauth-2.0 authorization


【解决方案1】:

您有几个选择:

令牌级权限

您可以为每个用户帐户提供不同的令牌,并将权限与令牌绑定。这冒着将错误的代币与错误的用户混淆的风险。但是,这也具有不必维护用户令牌关系的优点,因为权限是在令牌级别决定的。如何决定生成哪个令牌可能很棘手。

用户级权限

您可以将用户帐户绑定到令牌,然后可以为该用户授予读/写权限。这降低了用户在链接时使用错误令牌的风险。使用此方法,您可以为所有用户帐户使用相同的令牌生成方法,因为令牌不知道权限,但确实允许他们“访问”API(从而防止未经授权的访问)。

我故意避免提及特定类型的身份验证令牌,因为这两个概念可以适用于网络上大多数流行的选择(基于令牌、基于 OAuth)。

【讨论】:

  • 我认为问题更多是关于如何管理双管齐下的身份验证方案。您需要验证 API 用户,然后是提供自己凭据的最终用户。只要用户凭证合适,API 用户就可以有权做任何事情。但是,根据实现,API 用户可能具有受限访问权限。它是如何工作的?
  • 感谢您的回答,关于用户级权限,您是说认证也应该在那里完成吗?正如@AntTheKnee 所说,我们正在考虑首先对 API 用户(例如我们的网络应用程序)进行身份验证,然后在 API 用户通过身份验证后对用户使用辅助身份验证/授权。用你的方法可以吗?
  • @LewisChadwick 过去我实现了一个服务,它使用一对令牌来验证“应用程序”和“会话”,但在你的情况下,你可以将该会话令牌绑定到用户的帐户。可以生成用户令牌,将用户和应用程序绑定到“用户”令牌。您必须管理一组额外的令牌,但这会为您提供所需的粒度。
  • @phalt 你是说我们应该验证 API 用户,然后是最终用户,并在此过程之后提供一个令牌,这实际上意味着“API 用户和最终用户”合而为一?如果是这样,我想我喜欢它:)
【解决方案2】:

OAuth 没有concept of Identity

您应该考虑使用 OpenID Connect,它是 Oauth 2.0 之上的配置文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2015-09-10
    • 2018-11-29
    • 2013-08-21
    • 2011-10-02
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多