寫在前面:
在前一篇博客《OAuth2.0 原理簡介》中我們已經了解了OAuth2.0的原理以及它是如何工作的,那么本篇我們將來聊一聊OAuth的一種授權許可方式:授權碼(Authorization Code)
什么是Authorization Code ?
簡單來說授權碼就是的在第三方應用程序請求Authrization Server來獲取AccessToken之前的預先校驗,增加了獲取token的安全性。比如你吭哧吭哧寫了一天的代碼,急於回家吃上一口媳婦做的熱飯。當你走到小區門口的時候你需要刷卡才能進入到小區,然后找到你家在哪一棟樓,幾單元幾號,然后掏出鑰匙開門,才能回到家。在這個過程中授權碼就相當於是你在用鑰匙開門回家的前一步身份確認,如果你不是這個小區的,那你自然是沒有辦法進入到小區內部的。授權碼方式是OAuth2.0最常用的一種授權方式,比如:QQ,豆瓣,新浪微博等用的都是這種方式。
授權碼的工作流程解析

上圖的流程表示了請求的全過程,需要注意的點是:
發起授權請求需要的參數如下:
對應步驟(C),客戶端向Authorization Server發起請求的時候需要提供以下參數:
- response_type:必選。值固定為“code”。
- client_id:必選參數(第三方應用的標識ID,告訴服務器誰需要得到授權)
- state:Client提供的一個字符串,服務器會原樣返回給Client。
- redirect_uri:必選參數(授權成功后的重定向地址)
- scope:可選參數(表示授權范圍)
完整URL如下所示:
GET /authorize?response_type=code&client_id=1&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&scope=user,photo HTTP/1.1 Host: server.example.com
得到授權返回數據如下:
對應上圖中的步驟(E),A授權服務器會返回下面信息:
- code:授權碼(用於的下一步中請求token使用)
- state:步驟(C)中客戶端提供的state參數原樣返回。
完整的URL如下:
Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
發起獲取token的請求參數如下:
對應步驟(G):
- grant_type:必選參數(固定值“authorization_code”)
- code : 必選參數(上一步Response 中響應的code,避免在請求的過程中被篡改)
- redirect_uri:必選參數(必須和Request中提供的redirect_uri相同)
- client_id:必選參數(必須和上一步Request中提供的client_id相同,不能token和授權碼請求的第三方應用不一致)
得到token的response包含如下信息:
對應步驟(H):
- access_token:訪問令牌(服務器端加密過的字符串)。
- refresh_token:刷新令牌(刷新令牌的字符串)
- expires_in:過期時間(令牌的過期時間)
{
"access_token":"MJhjskotnFZFEjr1zCsicHJKSLA",
"token_type":"granttype",
"expires_in":4800,
"refresh_token":"JHJhjasdsjhKNSGKmzHDK",
"example_parameter":"example_value_test"
}
如果有一天你的小區的鑰匙被一個陌生人拿到了,那么他就可以名正言順的進入的小區里面,那么他進入到你家的機會就大了很多。一樣的道理,授權碼如果被竊取的話,那么對方就可以直接用你的授權碼來獲取到token從而竊取到你的信息,在使用的時候我們首先要要求授權碼不能夠被重復使用,如果一旦發現在token的生命周期內授權碼被重復使用的話則會強制銷毀此授權碼生成的所有token,重新再做一次登陸的授權驗證。
寫在最后:
授權碼是我們平時用到的最多的一種授權方式,它使得我們的的應用程序在獲取token之前多了一個額外的安全層來保證我們的授權和訪問過程是安全可靠的。
