详解OAuth2.0的授权码模式

176 阅读3分钟

上一篇JSON基础与Restful风格接口我们详细讲了JSON基础知识,Restful特性以及由于Restful的无状态性导致认证非常的重要,以及讲了OAuth2.0协议的模型和理解,今天我们讲讲具体的授权码模式详细流程,更好的理解OAuth2.0

授权码模式流程

对于同在UAA-server管理下的client们

  1. 用户访问某个客户端,客户端跳转到认证中心(UAA)
  2. 若用户已经登录过,选择是否授权,若未登录过,登录,再进行授权
  3. 假设用户给了授权,认证服务器将用户导向客户端事先指定的URL,并附上一个授权码code
  4. 客户端收到授权码,附上重定向的授权码code,redirect_uri,clientID,grant_type四个参数向UA申请token,这一步是客户端后台完成的,对用户不可见
  5. 认证服务器核对之后,返回access token和refresh token等

步骤详情

  1. 客户端申请认证的URL 参数:
  • response_type:表示授权类型,必选项,此处的值固定为"code"
  • client_id:表示客户端的ID,必选项。(如微信授权登录,此ID是APPID)
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https://client.example.com/cb HTTP/1.1
HTTP/1.1 Host: server.example.com
  1. 认证服务器返回
  • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz
  1. 申请token
  • grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
  • code:表示上一步获得的授权码,必选项。
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
  • client_id:表示客户端ID,必选项。

请求头headers

Authorization -> Basic aW50ZXJuZXRfcGx1czppbnRlcm5ldF9wbHVz 。注意是Basic 开头然后是clientid:clientScret 格式进行base64加密后的字符串。

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https://client.example.com/cb


服务端的返回

 HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }
     

于是就可以带着token去访问API了

更新令牌

如果使用的时候发现令牌过期了

客户端发出更新令牌的HTTP请求,包含以下参数:

  • granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
  • refresh_token:表示早前收到的更新令牌,必选项。
  • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

大致流程就结束了,下一篇文章将实际操作微信OAuth2.0实际操作.进一步加深理解.