OAuth 2 是个啥

OAuth 2 是一套用于授权的协议,但本身没有验证和用户管理的功能
OAuth2 用于帮助 身份提供者 做权限认证

角色与流程

角色

整个过程共有以下角色参与

  • 用户:一个具体的人或组织
  • 客户端:需要访问资源的客户端,由用户来操作
  • 授权服务器:身份验证的服务器,认证客户端并授权
  • 资源服务器:存储资源的服务器,上面有客户端希望获取的内容

以一个常见场景举例说明 —— 通过 微博 一键登录 百度网盘:

  1. 首先我要有 微博 账号并且登录
  2. 我在 百度网盘 中点击 通过微博登录
  3. 会跳转到 微博的授权页面,询问是否允许 百度网盘 获取我微博的 昵称、头像信息
  4. 我点击允许后,百度网盘 从微博获取我的 昵称、头像等账号信息
  5. 自动跳转到 百度网盘页面并成功登录

上面的例子中:

用户:我

客户端:百度网盘(是它要获取我微博的昵称和头像)

授权服务器:微博(它向我询问是否授权给百度网盘)

资源服务器:微博(存储我的昵称、头像信息)

大致流程

根据上面的例子,可以把流程抽象出来

  1. 客户端 向 授权服务器发起授权请求
  2. 授权服务器 向 客户端返回 授权码
  3. 客户端 携带 授权码请求 资源服务器
  4. 资源服务器 将 客户端 需要的信息提供给 客户端

四种授权许可方式

为什么上面会说是 大致流程呢?

因为客户端 从 授权服务器 获取 授权码 的过程有四种不同的方式

授权码

特点:功能最完整,流程最严密,通常外部服务都会通过这种方式来授权

客户端 向 授权服务器发起获取 授权码 code 的请求
请求内容

字段名作用字段内容
client_id用于识别向哪个应用授权唯一的应用id
redirect_uri用于表示授权成功后的跳转页面url
response_type表示授权后客户端返回的类型固定值 code 表示获取授权码
state用于客户端验证 验证服务器 的身份,防止中间人攻击随机字符串

授权服务器 响应 客户端 请求,发送 code 给 客户端
响应内容

字段名作用
code授权码
state与请求内容时发送的内容相同,用于防止中间人攻击

客户端 向 授权服务器 发起请求,请求 accesstoken 和 refreshtoken
请求内容

字段名作用字段内容
code证明客户端已经验证过身份上轮响应中的授权码
client_id用于识别客户端类型固定值,从授权服务器处申请
client_secret用于验证客户端身份固定值,从授权服务器处申请

授权服务器 响应 客户端请求,返回 accesstoken 和 refreshtoken
响应内容

字段名作用
accesstoken客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期
refreshtoken由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken
expire过期时间,表示 accesstoken 的有效时间

后面拿着 accesstoken 找 资源服务器 拿数据就是一样的流程了,不再赘述

简化模式

特点:相较授权码更简单,但安全性不及授权码(token 对用户可见)

客户端 向 授权服务器 发起获取 accesstoken 的请求
请求内容

字段名作用字段内容
client_id用于识别向哪个应用授权唯一的应用id
redirect_uri用于表示授权成功后的跳转页面url
response_type表示授权后客户端返回的类型固定值 token 表示获取 accesstoken
state用于客户端验证 验证服务器 的身份,防止中间人攻击随机字符串

授权服务器 响应 客户端请求,返回 accesstoken
响应内容

字段名作用
accesstoken客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期
refreshtoken由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken
expire过期时间,表示 accesstoken 的有效时间

密码模式

特点:使用验证服务器的用户名密码登录

  1. 客户端 请求 授权服务器的登录页面
  2. 用户 在 授权服务器上登录并授权(授权服务器验证账号密码是否正确)
  3. 授权服务器 向 客户端发送 accesstoken

响应内容

字段名作用
accesstoken客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期
refreshtoken由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken
expire过期时间,表示 accesstoken 的有效时间

客户端模式

特点:直接通过客户端的密钥直接获取 accesstoken,最方便(无需用户参与)也最危险

客户端 向 授权服务器 请求 accesstoken
请求内容

字段名作用
grant_type固定值 client_credentials 用于表示客户端授权

授权服务器 向 客户端发送 accesstoken
响应内容

字段名作用
accesstoken客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期

参考

  1. bilibili 彻底理解 OAuth2 协议
  2. 理解 OAuth2
  3. OAuth2 授权

Q.E.D.


此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。