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,返回资源客户端

步骤

(第一步):客户端页面提供授权服务器重定向链接

http://server/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read

response_type:返回授权码(code)
client_id:客户端ID,标识客户端身份
redirect_uri:授权码code,获取成功或失败后,客户端重定向URI,如果授权成功,uri附加授权码code参数
scope:授权范围

(第二步、第三步),用户跳转后,授权服务器要求用户登录并给客户端进行授权,授权成功后,重定向会客户端并接收授权码code

http://client/callback?code=AUTHORIZATION_CODE

第四步,客户端在后台向授权服务器请求令牌

http://server/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

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

流程

  • 第一步:客户端后台向授权服务器发起身份认证
  • 第二步:验证通过,授权服务器向客户端返回令牌
  • 第三步:客户端通过令牌请求资源服务器资源

第一步

http://server/oauth//token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

grant_type:于client_credentials表示采用凭证式

第二步

授权服务器通过以后,直接返回令牌。