理解OAuth 2.0

196 阅读5分钟

1.什么是 OAuth 2.0?

以下是 OAuth 2.0 IETF 规范中给出的 OAuth 2.0 定义:

OAuth 2.0授权框架支持第三方应用程序获取对HTTP服务的有限访问通过编排审批交互来代表资源所有者在资源所有者和HTTP服务之间,或者通过允许第三方应用程序以自己的名义获得访问权。

需要了解的一点是,OAuth 2.0 为应用提供了一种获取用户受保护资源(如支付宝账户或其他用户可能希望通过应用访问的敏感信息)有限访问权限的方法,而无需用户将其登录凭据(用户名、密码)透露给应用

Tips: OAuth 2.0解决了一个什么问题?以网站的第三方登录为例子,网站A接入了微信、支付宝、微博的登录。你想要通过这三个网站的用户名登录接入的网站,正常情况下你需要输入你的用户名和密码在接入微信、支付宝、微博的登录网站A。但是这样你就需要向这网站A提供微信、支付宝、微博的账号密码。从根本上说,您要向应用提供这些敏感信息。您是否信任该网站A拥有你的密码和用户名这一行为?如果该应用遭到入侵,怎么办?如果这样,您必须要记得更改每个帐户的银行凭据。而OAuth 2.0就是为了解决这个问题

2. OAuth 2.0角色

OAuth 2.0中定义了四个角色

  • 资源拥有者(resource owner): 也称为最终用户。通常是指能够授权访问受保护资源的人员(或其他实体),例如:微信中的头像信息,这个资源的拥有者就是你。
  • 资源服务器 (resource server): 托管受保护资源的服务器,能够使用访问令牌接受和响应受保护的资源请求,例如:你的微信头像信息存储在微信服务器
  • 客户端(Client):代表资源所有者并经其授权发出受保护资源请求的应用程序。例如:桌面应用,手机应用,服务器应用等等
  • 授权服务器(authorization server): 服务器成功认证资源所有者并获得授权后,向客户端发出访问令牌。

3.OAuth 2.0协议流程

图片来自OAuth 2.0官方文档

image.png

了解相关术语:

  • 授权许可:授予应用代表最终用户检索访问令牌的权限
  • 访问令牌(Access Token):一条长字符串,用作访问受保护资源的凭据
  • 受保护的资源:资源所有者拥有的数据。例如:账号头像、姓名、手机号等其他的敏感信息

OAuth 2.0协议流程说明:

  • (A)用户打开客户端以后,客户端要求用户给予授权。例如:微信便捷登录弹窗获取用户的账号信息流程
  • (B)用户同意给予客户端授权。例如: 点击同意获取授权
  • (C)客户端使用上一步(B)获得的授权,向认证服务器申请令牌。
  • (D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
  • (E)客户端使用令牌,向资源服务器申请获取资源。
  • (F)资源服务器确认令牌无误,同意向客户端开放资源。

4.什么是 OAuth 2.0 授权类型?

授权授予是代表资源所有者授权(访问其受保护资源)的凭据,客户机使用该授权来获取访问令牌。该规范定义了四种授权类型——授权代码、隐式、资源所有者密码凭证和客户端凭证——以及用于定义其他类型的可扩展机制。一般来说,每种授权类型都各有利弊,您需要根据您的业务用例进行权衡。其中一个考核因素之一:即将访问您的数据的应用的可信度 。通常第三方的应用可信度不如企业自己开发和使用的。例如:你在支付宝开发的小程序比支付宝内置的小程序的可信度低很多。

OAuth 2.0 的四种授权类型:

image.png

Tips: 后续会更新文章来详细讲解这四种授权类型

5. 什么是访问令牌(Access Token)

访问令牌是一条长字符串,可用作访问受保护资源的凭据。资源令牌(也称为不记名令牌)在 Authorization 标头中传递,如下所示:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM

或者POST请求体中,如下所示:

POST /resource HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

access_token=mF_9.B5f-4.1JqM

或者在URI请求参数中,如下所示:

GET /resource?access_token=mF_9.B5f-4.1JqM HTTP/1.1
Host: server.example.com

Tips: 参考datatracker.ietf.org/doc/html/rf…

访问令牌通常设有有效期(出于安全原因)。某些授权类型允许授权服务器发出刷新令牌,这允许应用在旧令牌到期时获取新的访问令牌。如需详细了解访问令牌和刷新令牌,请参阅 IETF OAuth 2.0 规范。例如时间的有效期时长等等在OAuth 2.0 规范中都给了建议以及相对应的说明

6. 通过范围限制访问权限

通过范围机制,OAuth 2.0 可以向应用授予受保护资源的有限访问权限。例如我们在使用微信登录第三方网站的时候,第三方网站只能获取到微信用户的账号的基本信息,而不能在第三方网站对微信的账号进行改动。

7. 客户端注册

在OAuth中定义了两种客户端类型:

  • 机密的(confidential)
  • 公开的(public)

所有客户端(应用)都必须注册准备向其请求访问令牌的 OAuth 2.0 授权服务器。注册后会生成客户端的client_id和client_secret。

8. 总结

通过对OAuth 2.0 规范的梳理,我们需要了解以下几点:

  • OAuth 2.0中的四个角色类型
  • OAuth 2.0的运行流程图
  • OAuth 2.0的四个授权模式,以及授权模式在什么情况下使用以及安全性等等
  • OAuth 2.0中的一些常见的名词,例如Access Token、refresh Token等等。

欲善其事,必先利其器。要想知道如何使用OAuth 2.0首先要了解其基础的知识。

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢

参考文档: