在浏览网页时,你肯定会遇到允许你使用社交媒体账户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。OAuth 2.0是对OAuth 1.0的彻底重写,OAuth 2.0与OAuth 1.0或1.1不向后兼容。
1. OAuth产生背景
为了更好的理解OAuth,我们假设有如下场景:有一个提供云冲印的网站,该网站可以将用户储存在百度网盘的照片冲印出来。用户为了使用该服务,必须让云冲印网站读取自己存储在百度网盘上的照片。
传统方式需要用户将自己的百度网盘用户名和密码告诉云冲印服务提供者,后者就可以读取用户的照片了。然而这种做法有着严重的缺点:
- 云冲印为了后续持续提供服务就会保存用户的密码,这样很不安全;
- 云冲印拥有了获取用户存储在百度网盘所有资源的权力,用户无法限制云冲印获得授权的范围和有效期;
- 用户只有修改密码,才能收回赋予云冲印的权力。但这样做又会使得其他所有获得用户授权的第三方应用程序全部访问失效;
- 只要有一个第三方应用程序被攻破,就会导致用户密码泄露,最终导致此密码保护的所有数据泄露。
为了解决以上问题就引入本文的主角OAuth。
2. 什么是OAuth?
OAuth是一种常用的授权框架,使网站和web应用程序能够请求对另一个应用程序上的用户账户的有限访问。OAuth允许用户在不向请求的应用程序公开其登录凭据的情况下授予此访问权限。这意味着用户可以调整他们想要共享的数据,而不必将其账户的完全控制权交给第三方。
基本的OAuth过程有两种应用场景:
- 集成需要从用户账户访问某些数据的第三方功能(设计之初的场景)。例如,应用程序可能会使用OAuth请求访问你的电子邮件联系人列表,以便建议与之联系的人员。
- 提供第三方身份验证服务(广泛使用的场景),允许用户使用他们在不同网站上的账户登录。
3. OAuth 2.0是如何工作的?
OAuth 2.0 最初是作为一种在应用程序之间共享对特定数据的访问的方式而开发的。它通过定义三个不同方(即客户端应用程序、资源所有者和OAuth服务提供商)之间的一系列交互来工作。
- 客户端应用程序:希望访问用户数据的网站或web应用程序。
- 资源所有者:客户端应用程序要访问的数据所属的用户。
- OAuth服务提供商:控制用户数据和访问数据的网站或应用程序。他们通过提供API与授权服务器和资源服务器交互来支持OAuth。
3.1. 工作流程
有许多不同的方式可以实现实际的OAuth流程,这些被称为OAuth“流”或“授予类型”,但总的来说,这两种类型都涉及以下阶段:
-
客户端应用程序请求访问用户数据的一个子集,指定他们想要使用的授权类型以及他们想要的访问类型。
-
系统会提示用户登录到OAuth服务,并明确表示同意请求的访问。
-
客户端应用程序接收一个唯一的访问令牌,该令牌证明它拥有来自用户的访问请求数据的权限。
-
客户端应用程序使用此访问令牌进行API调用,从资源服务器获取相关数据。
4. OAuth 2.0与OAuth 1.0的区别
OAuth 2.0 和 OAuth 1.0 都是授权框架,用于允许第三方应用访问用户资源,但它们在实现细节和设计理念上存在显著差异。OAuth 2.0不兼容OAuth 1.0,以下是 OAuth 2.0 与 OAuth 1.0 之间的主要区别。
4.1. 设计目的和用途
OAuth 1.0主要用于保护API资源, OAuth 2.0设计得更加通用,适用于各种类型的资源和应用,包括Web应用、移动应用和桌面应用。
4.2. 角色分离
OAuth 2.0允许API Server 和 Authorization Server分离,即API Server和Authorization Server可以独立部署,独立扩容。比如Google 的 OAuth 2.0 使用 “accounts.google.com” 作为Authorization Server,使用 “www.gooogleapis.com” 作为API Server。其中:
- Authorization Server:可以只是负责获得用户的授权并向应用分配access token。授权服务器需要知道应用的client_id和client_secret;
- API Server:只需要能够识别access token即可。
4.3. 认证流程
- OAuth 1.0:使用签名、临时令牌(token)和请求令牌(request token)进行认证,过程较为复杂。
- OAuth 2.0:使用访问令牌(access token)进行认证,流程相对简单。
4.4. 令牌类型
- OAuth 1.0:主要使用临时令牌和访问令牌。
- OAuth 2.0:除了访问令牌,还包括刷新令牌(refresh token),允许应用在访问令牌过期后重新获取。
4.5. 扩展性和灵活性
- OAuth 1.0:扩展性有限,需要自定义参数和签名。
- OAuth 2.0:提供了更多的扩展点,如资源服务器配置、客户端认证等。
4.6. 兼容性
- OAuth 1.0:由于实现复杂,兼容性可能较差。
- OAuth 2.0:设计得更加通用,兼容性较好。
总结来说,OAuth 2.0 相对于 OAuth 1.0 更加简单、灵活,OAuth 2.0 授权框架已成为提供对 Web API 安全访问的行业标准。OAuth 允许用户授予第三方应用程序访问其数据(如个人资料数据、照片和电子邮件)的权限,而不会损害安全性。
若想了解更多关于OAuth的细节,可以参阅如下官方文档:
- RFC 5849 - The OAuth 1.0 Protocol.pdf (访问密码: 6277)
- RFC 6749 - The OAuth 2.0 Authorization Framework.pdf (访问密码: 6277)
5. 参考链接
- https://oauth.net/2/
- https://aaronparecki.com/oauth-2-simplified/
- https://www.oauth.com/oauth2-servers/differences-between-oauth-1-2/