OAuth2四种授权方式小结
本文主要小结一下oauth2的四种模式的特点和适用场景。
OAuth2四种授权方式
OAuth2定义了四种授权方式:
- 密码模式(resource owner password credentials)
- 授权码模式(authorization code)
- 简化模式(implicit)
- 客户端模式(client credentials)
密码模式(resource owner password credentials)
密码授权流程
- 用户访问应用页面,输入第三方认证所需要的信息(QQ/微信账号密码)
- 应用页面拿到用户米和密码信息去认证服务器授权
- 认证服务器授权通过,拿到token,访问真正的资源页面
密码授权优点
- 不需要多次请求转发和额外开销,同时可以获取更多的用户信息。(都拿到账号密码了)
- 支持refresh刷新
密码授权缺点
- 因为client可能存了用户密码
- 局限性,认证服务器和应用方必须有超高的信赖
密码授权使用场景
- 这种模式主要用来做遗留项目升级为oauth2的适配方案
- 当然如果client是自家的应用,也是可以
授权码授权流程
- 用户访问页面
- 访问的页面将请求重定向到认证服务器
- 认证服务器向用户展示授权页面,等待用户授权
- 用户授权后,认证服务器生成一个code,和带上client_id发送给应用服务器,然后应用服务器拿到code,并将用client_id去后台查询对应的secret
- 将code、client_id、client_secret传递给认证服务器换取access_token和refresh_token
- 认证服务器将access_token和refresh_token传给应用服务器
- 验证token,访问真正的资源页面
授权码授权优点
- 这种模式算是正宗的oauth2的授权模式
- 安全性高,
有token过期时间;serect存在服务器端;第四步、第五步服务器到服务器访问,很难被截获
授权码授权缺点
- 多次请求,性能会有一定影响
授权码授权使用场景
- 目前市面上主流的第三方验证都是使用这种模式
隐式模式(implicit grant)
隐式授权模式流程
- 用户访问应用页面
- 重定向到认证服务器
- 用户授权
- 跳转到应用页面,并返回token信息
- 拿token去访问资源服务器
隐式授权模式优点
- 简单,比授权码模式少了code环节,回调url直接携带token
隐式授权模式缺点
- 基于安全性考虑,建议把token时效设置短一些
- 不支持refresh token
隐式授权模式使用场景
- 使用场景是基于浏览器的应用
- 应用只有页面,没有后台管理,只能使用第三方认证后,直接访问
- 不支持refresh token
客户端凭证授权(Client Credentials Grant)
客户端凭证授权流程
- 用户访问应用页面
- 直接根据client_id和secret即可获取token,
- 使用token访问资源服务器
客户端凭证授权优点
- 最简单的模式,只要client请求,我们就将AccessToken发送给它
- 无需用户参与
客户端凭证授权缺点
- 要求我们对client完全的信任
客户端凭证授权使用场景
- 为后台api服务消费者设计,不需要用户的参与
- 不支持refresh token,主要是没有必要
refresh token的初衷主要是为了用户体验不想用户重复输入账号密码来换取token,因而设计了refresh token用于换取新token
这种模式由于没有用户参与,而且也不需要用户账号密码,仅仅根据自己的id和密钥就可以换取新token,因而没必要refresh token
小结
- 密码模式(resource owner password credentials)(为遗留系统设计)(支持refresh token)
- 授权码模式(authorization code)(正宗方式)(支持refresh token)
- 简化模式(implicit)(为web浏览器应用设计)(不支持refresh token)
- 客户端模式(client credentials)(为后台api服务消费者设计)(不支持refresh token)