理解Oauth2的原理

一.OAuth是什么?

    OAuth的英文全称是Open Authorization,一种开放授权协议

二.OAuth2.0有什么用?

    第三方应用请求访问受保护资源时,资源服务器在获准资源用户授权后,会向第三方应用颁发一个访问令牌(AccessToken)。该访问令牌包含资源用户的授权访问范围、授权有效期等关键属性。第三方应用在后续资源访问过程中需要一直持有该令牌,直到用户主动结束该次授权或者令牌自动过期。

三.OAuth2.0有哪几种授权模式?

   授权码模式(Authorization Code)(正统方式)(支持refresh token)
   授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
   Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
   Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
   扩展模式(Extension)(自定义模式,这个就不介绍了)

1.授权码模式

   用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。
   关键字:第三方,用户,平台,关系如下图。
例:
理解Oauth2的原理
  在第②,④,⑥,⑧步中,分别用到了云打印在微博平台上获得的appid+appkey。关于每一步请求所需要的一系列参数这里就不一一列举了,官方文档非常详细,这里仅说明一下请求code和请求access token时重要的参数。
第④步参数:
  response_type:指授权类型,必选,这里填固定值‘code’
  client_id:指客户端id,必选,这里填在平台报备时获取的appid
  redirect_uri:指重定向URI,可选
  scope:指申请的权限范围,可选
  state:指客户端当前状态,可选,若填了,则认证服务器会原样返回该值
第⑥步参数:
  grant_type:指使用哪种授权模式,必选,这里填固定值‘authorization_code’
  code:指从第⑤步获取的code,必选
  redirect_uri:指重定向URI,必选,这个值需要和第④步中的redirect_uri保持一致
  client_id:指客户端id,必选,这里填在平台报备时获取的appid
  client_secret:指客户端**,必选,这里填在平台报备时获取的appkey
第⑧步参数:
  access_token:指访问令牌,必选,这里填第⑦步获取的access_token
  token_type:指令牌类型,必选,大小写不敏感,bearer类型 / mac类型
  expires_in:指过期时间,单位秒,当其他地方已设置过期时间,此处可省略该参数
  refresh_token:指更新令牌,可选,用即将过期token换取新token
  scope:指权限范围,可选,第④步中若已申请过某权限,此处可省略该参数

2.授权码简化模式

授权访问:
  http://localhost:8080/oauth2/oauth/authorize? response_type=token&client_id=testid&redirect_uri=http://localhost/OAuth&scope=read
之后接受访问,该页面将被重定向到重定向URI并带有令牌: http://localhost/OAuth/#access_token=KCIS89HFUE7SGE62&token_type=bearer&expires_in=3600

3.Pwd模式

请求格式:
  POST -D “&grant_type=password&username=babala&password=kkk1234&scope=read,write”
http://localhost/oauth/token
服务器返回来的访问令牌:
{
  “access_token”:“9cd23bef-ae56-46b0-82f5-b9a8f78da569”,
   “token_type” : “bearer” ,
   “expires_in” : 43199 ,
  “scope” : “read”
}

4.Client模式

请求格式:
POST -D “&client_id=appid&grant_type=client_credentials&client_secret=appkey” http://localhost/OAuth/token
服务器返回来的访问令牌:
{
  “access_token”:“4e56e9ec-2f8e-46b4-88b1-5d06847909ad”,
  “token_type”: "bearer” ,
  “refresh_token”:“7e14c979-7039-49d0-9c5d-854efe7f5b38”,
  “expires_in”: 36133 ,
  “scope”: “read,write”
}