书籍推荐
OAuth2 in Action -- 原理git
OAuth2 Cookbook -- 实践github
OAuth2 解决的问题域
- 开放系统间受权
- 现代微服务安全
- 单页浏览器App(HTML5/JS/无状态)
- 无线原生App
- 服务器端WebApp
- 微服务和API间调用
- 企业内部应用认证受权(IAM/SSO)
OAuth2的原理
OAuth2的最简向导能够很清楚的说明.简单明了(地址在https://github.com/MissWangLove/Micro-Service中的pdf下面).算法
应用请求资源服务器,访问客户数据,在没有OAuth2的状况下,资源服务器区分不出请求过来的应用是恶意用户仍是其余用户,数据都会返回. 有了OAuth2以后,使用受权服务器颁发给客户应用Access Token, 资源服务器拿到Access Token进行校验,验证经过以后才返回数据.浏览器
总体的流程就是:
客户应用向受权服务器请求Sccess Token ---> 受权服务器向用户征询意见,是否将权限授予客户应用 ---> 用户赞成 ---> 受权服务器生成颁发Access Token给客户应用 ---> 客户应用请求资源服务器 ---> 资源服务器验证客户应用的Access Token ---> 验证经过,返回数据.安全
涉及到三个角色:服务器
- 客户应用(请求资源方)
- 受权服务器(生成Access Token并颁发Access Token)
- 资源服务器(验证Access Token,返回资源)
OAuth2的定义
什么是Oauth2
- OAuth2是用于REST/APIs的代理受权框架(delegated authorization framework)
- 是基于令牌Token的受权,在无需暴露用户密码的状况下,是应用能获取对用户数据有限访问权限
- 解耦认证和受权
- 标准安全框架,支持多种用例场景
- 服务器端WebApp
- 浏览器单页SAP
- 无线/原生App
- 服务器对服务器之间
令牌类比仆从钥匙(Valet Key)
也就是给应用有限的访问权限,让应用可以表明用户去访问用户的数据.session
举个简单例子,让别人去你家取东西,将钥匙给他,东西在大厅,他仅仅能进入大厅,卧室的门和其余柜子的钥匙并无给他,也就没有权限进行访问.架构
因此说关键点在于有限的访问权限,这个很重要.框架
OAuth2的优势和缺点
优势:微服务
- OAuth2.0比1.0更容易实现
- 更安全,客户端不接触用户密码,服务器端更易于集中保护
- 普遍传播并被持续使用
- 短寿命和封装的token
- 资源服务器和受权服务器解耦
- 集中式受权,简化客户端
- HTTP/JSON友好,易于请求和传递token
- 考虑多种客户端架构场景
- 客户能够具备有不一样的信任级别
缺点:
- 协议框架太宽泛,形成各类实现的兼容性和相互操做性差
- 和OAuth1.0不兼容
- OAuth2.0不是一个认证协议(是受权协议),OAuth2.0自己并不能告诉你任何用户信息.
OAuth2.0主要角色
- 资源拥有着(RO): 资源的拥有人,想要分享某些资源给第三方应用
- 客户应用: 一般是一个Web或者无线应用,须要访问用户的受保护资源
- 资源服务器: Web站点或者Web service API,用户的受保护数据存在此处
- 受权服务器:客户应用成功认证并得到受权以后,向客户应用颁发访问令牌Access Token
OAuth术语
- 客户凭证: 客户的clientId和密码用于认证客户
- 令牌: 受权服务器在接收到客户请求后,颁发的访问令牌
- 做用域: 客户请求访问令牌时,由资源拥有者额外指定的细分权限(permission)
OAuth2的令牌类型
- 受权码(Authorization Code Token): 仅用于受权码受权类型,用于交换获取访问令牌和刷新令牌
- 刷新令牌(Refresh Token): 用于去受权服务器获取一个新的访问令牌
- 访问令牌(Access Token): 用于去表明一个用户或服务直接去访问受保护的资源.
- Bearer Token: 无论谁拿到Token,均可以访问资源,像现钞
- Proof of Possession(PoP Token): 能够校验client是否对Token有名确的拥有权
访问令牌是最重要的.
OAuth2.0误解
- OAuth并无支持HTTP之外的协议
- OAuth并非一个认证协议
- OAuth并无定义受权处理机制
- OAuth并无定义token格式
- OAuth2.0并无定义加密算法
- OAuth2.0并非单个协议
- OAuth2.0仅是受权框架,仅用于受权处理
OAuth的本质就是如何获取token和如何使用token.
OAuth是一种在系统间的代理受权协议(delegation authorization)
OAuth提供一个宽泛的协议框架,具体安全场景须要定制
OAuth使用代理协议的方式解决密码共享反模式问题
OAuth2.0的典型模型
受权码模式

简化模式(适用于单页应用)

密码模式

客户端模式

刷新令牌如何简化令牌的获取

模式选型
受权流程渠道(channels)

客户应用类型

四中OAuth2.0受权类型(Flows)

受权类型选择 ~ 流程

OAuth的极简pdf: https://github.com/MissWangLove/Micro-Service/tree/master/pdf