API密钥甚至令牌属于直接身份验证和授权机制的类别,因为它们授予对REST API公开资源的访问权限。此类直接机制可用于委派用例。
为了获得对REST端点公开的一个资源或一组资源的访问,需要根据其身份检查请求者特权。然后,工作流程的第一步是通过对请求进行身份验证来验证身份。后续步骤是根据一组定义的规则检查身份以授权访问级别(即读取,写入或读取/写入)。一旦完成了上述步骤,通常的另一个问题就是请求的允许速率,即允许请求者每秒对给定资源执行多少个请求。
OAuth(开放式授权)是用于委托访问的标准协议,主要的互联网公司通常使用它来授权访问而不提供密码。很明显,OAuth是一种协议,它满足了上述问题:身份验证和授权,通过代表资源所有者提供对服务器资源的安全委派访问。它基于访问令牌机制,该机制允许第三方代表资源所有者访问服务器管理的资源。例如,一旦John授权了代表团,ServiceX便要代表John访问John Smith的Google帐户。然后,将向ServiceX颁发基于时间的令牌,以访问Google帐户详细信息,这很可能仅是只读访问。
API密钥的概念与上述OAuth令牌非常相似。主要区别在于没有委托:用户直接向服务提供商请求密钥以进行连续的编程交互。API密钥的情况也是基于时间的:作为OAuth令牌的密钥受时间租约或有效期限制。作为附加方面,密钥以及令牌可以受到服务合同的速率限制,即,每秒仅可以服务给定数量的请求。
回顾一下,实际上,传统的身份验证和授权机制与基于密钥/令牌的版本之间没有真正的区别。不过,范式略有不同:使用了支持密钥/令牌,而不是在客户端与服务器之间的每次交互中都重复使用凭据,从而使整体交互体验更加顺畅且可能更安全(通常遵循JWT标准,令牌由服务器进行数字签名,以免进行精心设计)。
- 直接身份验证和授权:基于密钥的协议,是传统的基于凭据的版本的变体。
- 委托的身份验证和授权:类似于基于OAuth的协议,该协议又使用令牌,再次作为基于凭据的版本的变体(总体目标是不将密码公开给任何第三方)。
两种类别都使用传统的身份验证工作流与拥有感兴趣资源的服务器进行首次交互。