Skip to content 后端-从Oauth到Oauth2 
1. Oauth 是为了解决什么问题 
- Oauth是一个用户鉴权认证的协议,为了解决多平台、多场景的身份认证问题。一言以蔽之:解决的最核心问题:如果在资源所有者和第三方之间共享授权信息,无需暴露用户的登录凭证。
- 设计目的是为了实现跨平台认证,而不泄露用户的登录凭证,比如用户名和密码。
- 比如我的朋友需要临时进入我家,我不希望将钥匙给他,因为那样可能会泄露我的钥匙,存在安全问题。 我应该发放一个凭证给他,这个凭证里面记录了他的有关信息,当他来到门禁的时候,通过凭证进行校验即可。将来他回去了,这个凭证也可以进行回收。
- 不妨以这个场景为例,说明 Oauth2认证的大体流程:- 授权请求:朋友来到我家门口,但是被门禁挡住了,需要发出授权请求。
- 我的同意:我通过远程操作,告诉门禁机器,允许他进入。
- 发放令牌:门禁录入他的有关信息,注明了他是谁、他允许去哪里、他的令牌何时过期。
- 访问授权:朋友通过令牌顺利进入我家进行游玩。
- 撤销访问权:朋友回家之后,门禁令牌自动失效,他无法再次进入小区。
 
- 总结一下,令牌的好处有三点: - 能够控制访问资源的范围;
- 能够控制有效时间;
- 能够随时进行撤回;
 
2. 从 Oauth 到 Oauth2 
- 认证流程:Oauth 1.0主要提供了标准的认证流程,但是方式相对单一,在复杂场景下的泛化能力不足。
- 取消签名过程:Oauth 2.0取消了1.0的签名过程,全程使用HTTPS进行安全传输。
- 增强适用性:Oauth 2.0对资源服务器和授权服务器的角色进行了更新清晰的定义,使得浏览器、移动应用、桌面应用、后端服务之间的授权更加明确,扩大了使用场景。
- 令牌类型多样化:可以采用 Bearer令牌,也可以MAC令牌,为不同的安全需求都提供了便利。
3. 主要角色 
- 资源所有者(Resource Owner):资源所有者是最终用户,他拥有受保护的资源,例如用户的照片或社交媒体帖子。
- 客户端(Client):客户端是请求访问受保护资源的应用程序,例如Web应用程序或移动应用程序。
- 授权服务器(Authorization Server):授权服务器负责验证资源所有者的身份并颁发访问令牌给客户端。
- 资源服务器(Resource Server):资源服务器存储和提供受保护的资源,只有在有效的访问令牌下才能访问。
4. Oauth2 的 4 种场景 
3.1 授权码模式 
- 是目前最主流、最常见的的方式
- 一般来说,分成以下几个主要的步骤: - 客户端重定向用户到授权服务器,请求授权。
- 用户登录并授权客户端。
- 授权服务器将授权码返回给客户端。
- 客户端使用授权码向授权服务器请求访问令牌。
- 授权服务器验证授权码,并颁发访问令牌给客户端。
 

3.2 隐藏式 
- 纯前端的应用,没有后端,所以必须将令牌存储在前端,允许直接向前端颁发令牌,所有没有授权码这个概念。
- 过程如下:
- 第一步,A提供链接,要求用户跳转到B,授权用户数据给目标网站使用。
- 第二部,用户跳转到 B,登录后同意授权,那么,令牌就会放在URL当中,发放回A。
3.3 密码式 
- 如果高度信任某个应用,可以将用户名和密码直接告诉该应用,然后使用密码登录。
3.4 凭证式 
- 最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。
5. 安全方面的顾虑 
- OAuth 2.0有一些安全性考虑,包括:- CSRF攻击(跨站请求伪造): 攻击者试图通过伪造用户的身份来获得授权码。
- 令牌泄漏: 如果访问令牌泄漏,攻击者可以访问用户的资源。
- 未经授权的客户端: 未经授权的客户端可能会尝试访问受保护的资源。
 
6. JWT 可以工作在 Oauth2 场景下 
- JWT是一种轻量级的令牌格式,通常用于在- OAuth 2.0中表示访问令牌。它可以包含有关用户或客户端的信息,以及令牌的有效期等信息。- OAuth 2.0规范并没有要求使用- JWT,但它是一种常见的令牌格式选择,因为它具有自包含性和安全性。