定义
授予一个令牌,使得令者在特定时间能访问指定资源。
角色
- 用户:拥有很多资源的财主
- 客户端(应用+代理):想获得金主某些资源的商家
- 服务端(授权服务+资源服务):想尽办法保护财主的资源
- 商户请示用户:能不能给我这些资源?
- 用户礼貌地回答:没问题,拿我的手谕去银行换吧
- 商户询问银行前台:这是用户的许可证,给我资源好吗?
- 前台小妹核实之后:您的许可证有效,这是你的令牌
- 商户来到银行金库:我有令牌,可以给我用户的资源
- 金库大哥再次检测后:都给你找出来啦,请慢用
授权类型
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code):通过服务端
- 简化模式(implicit):通过App或Web
- 密码模式(resource owner password credentials):通过受信任的子应用
- 客户端模式(client credentials):通过第三方应用API
授权码授权
最常用的方式,因为它针对服务器端进行了优化,且保证了用户隐私。它基于重定向流,意味着程序必须能够与用户代理(比如浏览器)进行交互,流程如下:
- 客户端:带上客户端ID、回调地址、回传类型、访问级别,重定向到授权地址
- 用户:用户可以看到授权对象和权限列表,并且在登录状态下选择许可授权
- 服务器:如果用户许可了授权,则服务器会把code回传
- 客户端:通过临时的code,向服务端请求Token
- 服务端:颁发Token,客户端授权通过,同时得到响应资源
静默授权
常见于移动应用和网站,授权完成后不保证安全性。它同样基于重定向流(向服务端注册过的),不支持刷新Token。
- 客户端应用:基本与授权码一致,但回传类型为token
- 用户:完全与授权码一致,在登录状态下选择许可授权
- 服务端:如果用户许可授权,则重定向到客户端代理,并带上Token
- 客户端代理:重定向到客户端应用,并保留Token
- 客户端应用:发送一个包含脚本的页面给代理,并提取令牌
- 客户端代理:回传Token给应用程序,解码即可获得对应资源