Skip to content

后端-从Oauth到Oauth2

1. Oauth 是为了解决什么问题

  • Oauth 是一个用户鉴权认证的协议,为了解决多平台、多场景的身份认证问题。一言以蔽之:解决的最核心问题:如果在资源所有者和第三方之间共享授权信息,无需暴露用户的登录凭证
  • 设计目的是为了实现跨平台认证,而不泄露用户的登录凭证,比如用户名和密码。

  • 比如我的朋友需要临时进入我家,我不希望将钥匙给他,因为那样可能会泄露我的钥匙,存在安全问题。 我应该发放一个凭证给他,这个凭证里面记录了他的有关信息,当他来到门禁的时候,通过凭证进行校验即可。将来他回去了,这个凭证也可以进行回收。
  • 不妨以这个场景为例,说明 Oauth2 认证的大体流程:
    1. 授权请求:朋友来到我家门口,但是被门禁挡住了,需要发出授权请求。
    2. 我的同意:我通过远程操作,告诉门禁机器,允许他进入。
    3. 发放令牌:门禁录入他的有关信息,注明了他是谁、他允许去哪里、他的令牌何时过期
    4. 访问授权:朋友通过令牌顺利进入我家进行游玩。
    5. 撤销访问权:朋友回家之后,门禁令牌自动失效,他无法再次进入小区。

  • 总结一下,令牌的好处有三点:
    1. 能够控制访问资源的范围;
    2. 能够控制有效时间;
    3. 能够随时进行撤回;

2. 从 OauthOauth2

  • 认证流程Oauth 1.0 主要提供了标准的认证流程,但是方式相对单一,在复杂场景下的泛化能力不足。
  • 取消签名过程Oauth 2.0 取消了 1.0 的签名过程,全程使用 HTTPS 进行安全传输。
  • 增强适用性Oauth 2.0 对资源服务器和授权服务器的角色进行了更新清晰的定义,使得浏览器、移动应用、桌面应用、后端服务之间的授权更加明确,扩大了使用场景。
  • 令牌类型多样化:可以采用 Bearer 令牌,也可以 MAC 令牌,为不同的安全需求都提供了便利。

3. 主要角色

  • 资源所有者(Resource Owner):资源所有者是最终用户,他拥有受保护的资源,例如用户的照片或社交媒体帖子。
  • 客户端(Client):客户端是请求访问受保护资源的应用程序,例如Web应用程序或移动应用程序。
  • 授权服务器(Authorization Server):授权服务器负责验证资源所有者的身份并颁发访问令牌给客户端。
  • 资源服务器(Resource Server):资源服务器存储和提供受保护的资源,只有在有效的访问令牌下才能访问。

4. Oauth24 种场景

3.1 授权码模式

  • 是目前最主流、最常见的的方式
  • 一般来说,分成以下几个主要的步骤:
    1. 客户端重定向用户到授权服务器,请求授权。
    2. 用户登录并授权客户端。
    3. 授权服务器将授权码返回给客户端。
    4. 客户端使用授权码向授权服务器请求访问令牌。
    5. 授权服务器验证授权码,并颁发访问令牌给客户端。

image.png|500

3.2 隐藏式

  • 纯前端的应用,没有后端,所以必须将令牌存储在前端,允许直接向前端颁发令牌,所有没有授权码这个概念。
  • 过程如下:
  1. 第一步,A 提供链接,要求用户跳转到 B,授权用户数据给目标网站使用。
  2. 第二部,用户跳转到 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 ,但它是一种常见的令牌格式选择,因为它具有自包含性和安全性。