OAuth 2.0 一种授权协议,常用来授权第三方应用访问受保护的资源服务。
一、OAuth2.0四种角色
- 资源所有者
具有许可受保护资源访问权限的实体。 - 资源服务器
管理受保护资源的服务器: - 客户端
第三方应用程序,如浏览器、app - 授权服务器
授权服务器(颁发访问令牌、验证令牌、刷新令牌)
授权服务器可以和资源服务器是同一个服务,或者不同服务。
二、OAuth 2.0四种模式
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码式(password):
- 客户端凭证(client credentials)
三、授权码模式
授权码模式是最常用,也是安全相最高的授权模式。
适用有后端服务器web客户端,token令牌是保存在客户端后端,对资源服务器访问在后端完成,避免token泄露。
流程
- 第一步:用户访问客户端页面,重定向授权服务器
- 第二步:授权服务器要求用户是否对客户端进行授权
- 第三步:如果用户授权,授权服务器将用户重定向会客户端预先指定(重定向URI),uri- 附加授权码code
- 第四步:客户端收到授权码后,在后台向授权服务器申请令牌token
- 第五步:授权服务器核对授权码等无误,向客户端发送访问令牌(access token)和更新令牌(refresh token)
- 第六步:客户端携带令牌访问资源服务器资源,授权服务器验证token,返回资源客户端
步骤
(第一步):客户端页面提供授权服务器重定向链接
response_type:返回授权码(code)
client_id:客户端ID,标识客户端身份
redirect_uri:授权码code,获取成功或失败后,客户端重定向URI,如果授权成功,uri附加授权码code参数
scope:授权范围
(第二步、第三步),用户跳转后,授权服务器要求用户登录并给客户端进行授权,授权成功后,重定向会客户端并接收授权码code
第四步,客户端在后台向授权服务器请求令牌
client_id:客户端ID,标识客户端身份
client_secret:客户端密钥,后台传输要求保密,不能泄露
grant_type:AUTHORIZATION_CODE,表示采用的授权方式是授权码
code:前面获取的授权码
redirect_uri:令牌颁发后的回调网址
第五步,授权服务器核对无误,颁发令牌。
{
“access_token”:“ACCESS_TOKEN”,
“token_type”:“bearer”,
“expires_in”:6200000,
“refresh_token”:“REFRESH_TOKEN”,
“scope”:“read”
}
第六步:客户端携带token访问资源服务器资源
四、隐藏式
隐藏式模式,适用于纯前端应用,没有后端服务。令牌必须存储前端,安全性低。没有授权码步骤,直接获取令牌,所以称为(授权码)“隐藏式”(implicit)。
适用于纯前端应用,没有后端服务
比授权码模式少了获取授权码code步骤,回调url直接携带token
令牌保存前端,安全性低,建议把token时效设置短一些
不支持refresh token
流程
- 第一步:用户访问页面时,重定向到授权服务器。
- 第二步:授权服务器给用户一个认证页面,等待用户授权。
- 第三步:假设用户给予授权,授权服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
- 第四步:验证Token,访问真正的资源页面
第一步
http://server/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL
response_type:表示授权类型,此处的值固定为"token",必选项。
client_id:表示客户端的ID,必选项。
redirect_uri:表示重定向的URI,可选项。
scope:表示权限范围,可选项。
第三步
http://client/callback#access_token=TOKEN
access_token:表示访问令牌,必选项。
五、密码式
用户向客户端提供自己的用户名和密码,直接向授权服务器请求令牌
通常用在用户对客户端高度信任的情况下,比如内部系统
认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
流程
- 第一步:用户向客户端提供用户名和密码。
- 第二步:客户端将用户名和密码发给授权服务器,请求令牌。
- 第三步:授权服务器验证通过,向客户端提供访问令牌。
http://server/oauth//token?grant_type=password&username=USERNAME&password=PASSWORD
grant_type:表示授权类型,此处的值固定为”password”,必选项。
username:表示用户名,必选项。
password:表示用户的密码,必选项。
scope:表示权限范围,可选项。
六、客户端凭证
调用者是一个后端的模块,没有用户界面的时候,可以使用客户端模式。鉴权服务器直接对客户端进行身份验证,验证通过后,返回 token
流程
- 第一步:客户端后台向授权服务器发起身份认证
- 第二步:验证通过,授权服务器向客户端返回令牌
- 第三步:客户端通过令牌请求资源服务器资源
第一步
grant_type:于client_credentials表示采用凭证式
第二步
授权服务器通过以后,直接返回令牌。