OAuth2 协议
概念
OAuth2
是 授权 协议。
参与者:
- Resource Owner(资源所有者)
- Resource Server(资源服务器)
- Third-party application(第三方)
- Authorization Server(授权服务器)
- User Agent(用户代理,如用户浏览器)
案例-谷歌云冲印:
- 谷歌用户小明——资源所有者
- 谷歌云盘——资源服务器
- 谷歌云冲印——第三方服务
- 谷歌授权服务
- 浏览器
模式
授权码模式、简化模式、密码模式、客户端模式
授权码模式
- 小明访问谷歌云冲印网站,申请打印照片,云冲印将用户导向与谷歌约定的授权页面。
- 小明选择同意,登录谷歌账号并授权
同意之后,申请授权码:
- 确定校验类型,此处
response_type
= “code” - 验证谷歌云冲印是否在谷歌云平台注册,通过
client_id
- 授权,根据谷歌用户信息及
scope
生成授权码code
根据指定的
redirect_uri
跳转到云冲印网站,同时带回参数(code
,state
)注意
state
参数应从步骤1,由谷歌云冲印提供随机数,并在步骤2跳转回来的时候,原值带回。可有效防止CSRF(跨站请求伪造)
- 确定校验类型,此处
- 云冲印网站向认证服务器请求令牌
access token
- 校验
state
,防止 CSRF - 附上
code
、redirect_uri
、client_id
、client_secret
、grant_type
= “authorization_code”, - 认证服务器通过
client_id
、client_secret
认证云冲印应用 - 认证服务器通过
code
、redirect_uri
校验code
- 认证服务器根据
code
、grant_type
生成access token
、token_type
、expires_in
、refresh_token
- 校验
云冲印应用根据令牌向谷歌云盘(资源服务器)请求资源
问题思考:
- 为什么
state
参数可以有效防止CSRF(跨站请求伪造)?
没有state
的情况,提供response_type
、client_id
、scope
、redirect_uri
,通过CSRF可以取得有效的code
。有随机state
的话,获取到code
,可以通过state
校验是否有效。 - 省略获取授权码,直接返回令牌,有什么影响?
令牌可以直接访问资源,直接暴露出来安全程度大大下降,加上授权码的获取,由客户端应用服务器申请令牌,再请求资源,可以大幅提升安全性。
- 为什么
简化模式
- 客户端将用户导向认证服务器。
- 用户决定是否给于客户端授权。
- 假设用户给予授权,认证服务器将用户导向客户端指定的”重定向URI”,并在URI的Hash部分包含了访问令牌。
- 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
- 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
- 浏览器执行上一步获得的脚本,提取出令牌。
- 浏览器将令牌发给客户端。
密码模式
- 用户向客户端提供用户名和密码。
- 客户端将用户名和密码发给认证服务器,向后者请求令牌。
- 认证服务器确认无误后,向客户端提供访问令牌。
客户端模式
- 客户端向认证服务器进行身份认证,并要求一个访问令牌。
- 认证服务器确认无误后,向客户端提供访问令牌。