OAuth - 什么是资源所有者?它何时不是终端用户?

42

“资源所有者”一词在OAuth v2.0规范中被定义为“能够授予对受保护资源访问权限的实体。当资源所有者是人时,它被称为最终用户。”

我的问题是,什么情况下资源所有者不是最终用户?我希望通过真实用例的解释来理解。例如,如果受保护的资源是Facebook用户的照片,那么资源所有者是Facebook还是上传照片的Facebook用户?此外,如果这个人不是OAuth实施的应用程序的用户,为什么资源所有者(也是一个人)被认为是最终用户呢?如果Facebook用户是资源所有者,那么Facebook在这个交换中扮演什么角色?

7个回答

36

资源所有者不仅可以是人,还可以是机器。在企业环境中,OAuth流程中完全没有涉及到人类的情况非常普遍。至少,这就是我在RFC 5849(以及后来的OAuth 2.0)中引入这个术语时的意思。


2
感谢您抽出时间回答这个问题。我的理解是,资源所有者指的不仅仅是一个人,还可以是能够响应授权请求并授予授权的服务器。这个定义自提出以来是否有所扩展?或者您认为本次讨论中的例子被过度分析了吗? - smartcaveman
1
我认为这个讨论已经快要过度分析了。这个术语自从我第一次引入它以来并没有改变。最容易理解它的方法是用“拥有/控制资源的人”来替换它,但要记住它不一定是一个人。例如,它可以是您的操作系统根据某些内部策略(作为root运行与否等)向应用程序授予对OS资源的访问请求。我不知道任何非人类使用案例,所以这基本上是理论性的。 - Eran Hammer
在企业环境中(例如,许多用户属于一个组织),我听说不应该使用“客户端凭据”来访问组织数据。但是,“服务帐户”难道不可以只是使用client_credentials授权的oauth2客户端吗?而且该服务帐户与所属组织相关联? - Cody A. Ray

11
考虑这样一种情况,资源所有者是一个企业,可能有政策来启用/禁用对资源的访问。
以艺术品为例; 假设你想使用一件艺术品来装饰你的住所; 有几个地方可以选择(例如Costco),在那里你可以选择一件艺术品,将其打印在你选择的媒介上,并按你选择的尺寸交付到你家中。
问题在于,Costco不是该艺术品的许可权所有者;这超出了他们业务的范畴。他们销售商品,而不是收藏艺术品。他们所做的是与内容所有者(艺术品许可证的所有者)谈判,获得使用该艺术品进行打印的权利,然后将其制作并交付给你。你支付Costco购买艺术品;Costco然后从你的付款中向许可证持有人支付使用艺术品的权利的部分费用。
在你已经与资源所有者建立了关系的情况下,这种方法也同样适用;假设你已经谈判并购买了一些音乐的权利。你不是音乐的所有者,因为你没有权利转售音乐;但是你确实有权利听它(这是标准的数字版权管理情况)。现在假设你想通过网站播放这种音乐;你可以向网站发出请求获取该音乐;网站可以使用你的身份信息联系内容所有者(真正的许可证持有人,但实际上是相同的);内容所有者可以根据你的条件决定是否授予该网站代表你访问内容的权限。
希望这些解释能够澄清一些事情。

@Paul Sonier,非常感谢您的帮助。请帮我确认一下我的理解是否正确。如果我从Costco购买许可证(一种资源),那么Costco就是在艺术家(资源所有者)和我(客户端)之间充当中介。在OAuth中,Costco似乎相当于资源服务器授权服务器的角色。然而,我与艺术家没有任何沟通,只与Costco有联系。因此,我实际上没有与资源所有者进行任何交流。这似乎类似于隐式授权授予 - smartcaveman
@Paul Sonier,在Costco和DRM的情况下,客户与资源所有者之间没有直接联系。在DRM的情况下,存在对代理资源所有者的请求,该代理并不是实际的资源所有者,但是为了交互而扮演该角色。所以,有几个问题:(1)到目前为止,我是否都正确理解了?(2)是否需要区分资源所有者及其代理?(3)如果需要,如何处理OAuth中潜在的无限资源所有者代理链? - smartcaveman
@Paul Sonier,(4)一旦我购买了音乐许可证,我不是现在拥有该许可证的资源所有者吗?这可以解释为什么与DRM许可证提供商的交互似乎缺乏,因为资源服务器实际上只是将我验证为许可证的正确资源所有者。然后,它只是作为一个授权服务器的网站功能来验证我通过网站听歌的权利。我的理解正确吗? - smartcaveman
@smartcaveman:但总的来说,你对情况有很好的掌握。在Costco的具体实例中,他们实际上并没有直接保留资源;他们根据用户提供的查询参数查询资源,并代表用户向第三方(打印机)提供资源(艺术品)。这是一个有趣的过程。 - Paul Sonier
@Paul Sonier,(1)我可以看出为什么资源授权代理和资源所有者之间的区别可能是相关的。请考虑授权代理的授权数据并不总是像资源所有者的数据那样及时更新。如果系统引用了这两个来源,那么如果值发生冲突,它需要知道哪一个是可信的。我可能会为特定用户缓存Facebook的授权信息,并且只有在Facebook资源上有新的“modified_date”时才直接与Facebook进行授权。 - smartcaveman
显示剩余3条评论

6
考虑您有一个Facebook应用程序。
现在,您想要获取所有用户活动的统计信息(换句话说,“见解”)。 在这种情况下,资源(“应用见解”)归您的应用程序所有,而不是每个用户。 因此,您的应用程序获得客户端访问令牌(称为2-legged OAuth),并访问其见解。
Facebook还提供“页面见解”作为资源,该资源是页面的粉丝活动。在这种情况下,资源由页面拥有,而不是页面的粉丝,因此您的应用程序获得页面的访问令牌。
但我可以理解您的困惑。
以前,Facebook允许使用页面所有者访问令牌或页面访问令牌访问页面见解。(这意味着Facebook将其视为页面和页面所有者的资源;现在只允许页面访问令牌)
最后,在所有情况下,Facebook都充当“授权服务器”和“资源服务器”。 它验证用户并获得客户端访问其资源的批准。(授权服务器) 它也提供资源。(资源服务器)

3

我的公司与一个屏幕共享视频会议提供商合作。我们的用户可以将他们的解决方案作为我们的一部分来使用。我们与第三方工具之间的通信是通过调用API进行的,使用2-legged OAuth。

我们不是人,更好的措辞可能是外部系统,但我们绝对是资源所有者——因为我们支付我们使用的资源,并且我们是授权调用API的实体。

此外,在你提到的Facebook示例中,资源所有者是上传照片的人。那个人也是最终用户。第三方应用程序为了其利益而发出API调用的人。


但是在Facebook的例子中 - Facebook“授权调用API”并“支付资源费用”,那么为什么用户是资源所有者? - smartcaveman
2
Facebook不授权访问——Facebook用户才能授权。Facebook只是促进了这种授权。 - Andrew Arnott
资源所有者拥有资源,例如上传的图片。资源所有者还可以授权其他应用程序访问该资源(图片)。资源所有者可以是个人,如果是这样,他/她可以被称为最终用户。 - Jon Nylander

2
我想强调@Paul Sonier的扎实回答,并举一个与OAuth 2.0相关的更具体的例子。在企业环境中,公司员工可能希望在公司企业账户的保护下访问文件存储服务(例如Google Drive、Box.com、Dropbox等)中的内容。这些服务可能已经有单点登录安排,其中用户与服务提供商的账户是动态或批量进行配置的。重要的是,员工通常会将他们所产生的任何文档或其他工作的所有权转让给公司。从法律意义上讲,公司而不是最终用户是资源所有者。在这种情况下,OAuth2授权步骤是多余的。公司在与服务提供商的合同中可能会合理地说:“将我们的IDP认证的任何用户会话视为预授权我们所有应用程序”。服务提供商可以简单地跳过这些应用程序的授权步骤,并且能够节省成千上万的员工混淆的步骤和大量的支持台电话等。最终,授权授予只是数据存储中的一个条目,并受到OAuth 2.0规范之外的策略的约束。OAuth 2.0规范中没有阻止或不鼓励此类“批量授权”的内容。这只是服务提供商和真正的资源所有者之间的协议问题。请注意,此应用程序级别的授权与文件和目录权限不同,通常也是在带外进行管理的。也就是说,存储服务提供了一个用户界面来管理用户和组级别对文件和目录的访问。OAuth 2.0客户端随后获取用户级令牌(大多数仅支持面向消费者的“授权码”授予类型)。

1

从规范中:

资源所有者 - 一种能够授予对受保护资源访问权限的实体。当资源所有者是人时,它被称为最终用户。

从这个定义中,我理解到许多实体可能有能力授予对受保护资源的访问权限。

正如您所指出的,人类的例子很容易理解 - 当您请求访问我的受保护照片时,只有一个实体有能力授予访问权限。那个实体就是我。我必须执行某些操作来授予您的请求。根据应用程序的不同,这可能涉及点击按钮、发送短信、说话、鼓掌等等。捕获和处理我的操作的机制与此定义无关。

继续以这个例子为例,假设另一个实体可以授予对我的受保护照片的访问权限。想象一下,您是照片托管服务的值得信赖的商业伙伴。或者,您是照片托管公司的另一个团队,您的服务器在同一数据中心内运行。在这种情况下,自动授予您对受保护照片的访问权限可能是可取的。如果资源服务器决定自动授予您访问权限(因为您是谁),这将代表第二个实体。在这里,这个非人类实体已经决定(在它所有的智慧中)应该自动接受您的访问请求。


这个分析非常有帮助。然而,关于我的问题的第二部分——你能想到一个资源所有者不是人的情况吗?似乎你所讨论的是一种情况,即非人类被人类资源所有者委派某些访问授权权限,但资源所有者仍然是人。我是否混淆了? - smartcaveman

0

资源所有者通常是用于从受保护的资源服务器检索记录的外键。

如果用户在资源服务器上拥有照片,并且可以使用 user_id 从资源服务器检索照片。

身份验证服务器在身份验证过程中(用户名/密码/OTP)检索 user_id

防篡改(签名)JWT令牌确保使用相同的 user_id 从资源服务器检索记录。

授权服务器生成带有外键 user_id 的JWT令牌(访问/ID)。

资源服务器接收JWT令牌以授权检索由资源所有者(user_id)拥有的记录(资源)。

SELECT * FROM photos WHERE user_id = '[jwt.payload.user_id]';

现在,将 user_id 替换为任何(非最终用户)外键,例如 transaction_id

SELECT * FROM files WHERE transaction = '[jwt.payload.transaction_id]';

要确定资源所有者,请问自己:

  1. 从资源服务器检索资源所有者的记录需要哪些外部资源密钥?
  2. 从认证服务器检索资源密钥需要哪些身份验证(证明)?

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