OAuth 2 是个啥
OAuth 2 是一套用于授权的协议,但本身没有验证和用户管理的功能
OAuth2 用于帮助 身份提供者 做权限认证
角色与流程
角色
整个过程共有以下角色参与
- 用户:一个具体的人或组织
- 客户端:需要访问资源的客户端,由用户来操作
- 授权服务器:身份验证的服务器,认证客户端并授权
- 资源服务器:存储资源的服务器,上面有客户端希望获取的内容
以一个常见场景举例说明 —— 通过 微博 一键登录 百度网盘:
- 首先我要有 微博 账号并且登录
- 我在 百度网盘 中点击 通过微博登录
- 会跳转到 微博的授权页面,询问是否允许 百度网盘 获取我微博的 昵称、头像信息
- 我点击允许后,百度网盘 从微博获取我的 昵称、头像等账号信息
- 自动跳转到 百度网盘页面并成功登录
上面的例子中:
用户:我
客户端:百度网盘(是它要获取我微博的昵称和头像)
授权服务器:微博(它向我询问是否授权给百度网盘)
资源服务器:微博(存储我的昵称、头像信息)
大致流程
根据上面的例子,可以把流程抽象出来
- 客户端 向 授权服务器发起授权请求
- 授权服务器 向 客户端返回 授权码
- 客户端 携带 授权码请求 资源服务器
- 资源服务器 将 客户端 需要的信息提供给 客户端
四种授权许可方式
为什么上面会说是 大致流程呢?
因为客户端 从 授权服务器 获取 授权码 的过程有四种不同的方式
授权码
特点:功能最完整,流程最严密,通常外部服务都会通过这种方式来授权
客户端 向 授权服务器发起获取 授权码 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 的有效时间 |
密码模式
特点:使用验证服务器的用户名密码登录
- 客户端 请求 授权服务器的登录页面
- 用户 在 授权服务器上登录并授权(授权服务器验证账号密码是否正确)
- 授权服务器 向 客户端发送 accesstoken
响应内容
字段名 | 作用 |
---|---|
accesstoken | 客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期 |
refreshtoken | 由于 accesstoken 可能会过期,为避免重新授权,可将此 token 发送给 授权服务器,快速获得新的 accesstoken |
expire | 过期时间,表示 accesstoken 的有效时间 |
客户端模式
特点:直接通过客户端的密钥直接获取 accesstoken,最方便(无需用户参与)也最危险
客户端 向 授权服务器 请求 accesstoken
请求内容
字段名 | 作用 |
---|---|
grant_type | 固定值 client_credentials 用于表示客户端授权 |
授权服务器 向 客户端发送 accesstoken
响应内容
字段名 | 作用 |
---|---|
accesstoken | 客户端用此 token 去 资源服务器 获取需要的资源,此 token 包含了 客户端身份、客户端权限(能访问哪些内容)、客户端访问有效期 |
参考
Q.E.D.