为什么OAuth的设计中要有请求令牌和访问令牌?

46
在OAuth协议中,服务消费者会要求用户在服务提供者域中授权一个请求令牌,然后将该请求令牌与服务提供者进行交换,以获取访问令牌
我想知道为什么OAuth的设计中需要使用两个令牌。
为什么不只使用一个令牌呢?也就是说,用户应该授权该令牌,然后服务消费者可以使用该令牌从提供者检索信息。
2个回答

32
为了可用性和安全性考虑。
来自OAuth初学者指南

https://hueniverse.com/beginners-guide-to-oauth-part-iii-security-architecture-e9394f5263b5

...尽管OAuth规范的演变使得它成为了一个人工制品,但是两个令牌设计提供了一些可用性和安全性功能,这使得它值得留在规范中。OAuth在两个通道上运行:前端通道用于与用户进行交互并请求授权,后端通道由消费者直接与服务提供者交互。通过将访问令牌限制为后端通道,令牌本身对用户保密。这允许访问令牌承载特殊含义,并且具有比前端通道请求令牌更大的大小,在某些情况下需要手动输入(移动设备或机顶盒)。

===

请注意,此问题是OAuth为什么要将临时凭据更改为令牌凭据的副本
如果初学者指南中的解释不清楚,请阅读@npdoty的看法

2
初学者的OAuth指南链接似乎已经失效。此外,“请求令牌”这个术语目前似乎没有使用。它是否类似于OpenIdConnect 1.0 / OAuth2文档中的授权码? - Michael Freidgeim

1

来自官方OAuth 1.0指南

OAuth协议使网站或应用程序(消费者)通过API从Web服务(服务提供商)访问受保护的资源,而无需要求用户向消费者披露其服务提供商凭据。更一般地说,OAuth创建了一种可自由实现和通用的API身份验证方法。
一个示例用例是允许打印服务printer.example.com(消费者)访问存储在photos.example.net(服务提供商)上的私人照片,而无需要求用户向printer.example.com提供其photos.example.net凭据。
OAuth不需要特定的用户界面或交互模式,也不指定服务提供商如何验证用户,因此该协议非常适合身份验证凭据对于消费者不可用的情况,例如OpenID。
OAuth旨在将委托的Web服务身份验证的体验和实现统一到一个社区驱动的协议中。OAuth建立在已经由各个网站独立实现的现有协议和最佳实践之上。作为一种开放标准,得到大型和小型提供商的支持,促进了应用程序开发人员和这些应用程序的用户之间一致和可信赖的体验。
总的来说,用户提供用户名和密码以获取OAuth请求令牌。您将请求令牌提供给希望使用OAuth连接到某个服务的服务,他们将收到访问令牌。这样可以确保该服务永远不会看到/使用用户名和密码。

3
请求令牌是由服务消费者生成的。用户名和密码无法从请求令牌中恢复。那么为什么不直接使用请求令牌作为访问令牌呢? - Morgan Cheng
1
这就是xAuth的作用,但我找不到任何原因。 - Conceited Code
xAuth要求用户与客户端应用程序共享其凭据(用户名和密码)。OAuth的设计使这不再是必需的。 - fiirhok

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