于日前申請了博客園的API權限,經過一段時間研究,完成了Token獲取、刷新及用戶登錄基本功能的實現。
在進入主題之前先了解一下一個基礎但非常重要的知識grant_type
:
authorization_code
:授權碼模式(即先登錄獲取code,再獲取token)
password
:密碼模式(將用戶名,密碼傳過去,直接獲取token)
client_credentials
:客戶端模式(無用戶,用戶向客戶端注冊,然后客戶端以自己的名義向’服務端’獲取資源)
implicit
:簡化模式(在redirect_uri 的Hash傳遞token; Auth客戶端運行在瀏覽器中,如JS,Flash)
refresh_token
:刷新access_token
獲取Token
獲取token的url是https://api.cnblogs.com/token
,此時grant_type
取值應該為client_credentials
,另外還需要client_id及client_secret。
調試方便,暫時使用postman進行模擬請求。
需要說明的一點是,請求為POST,需要添加兩條header,分別是
Content-Type:application/x-www-form-urlencoded
Authorization:Basic .....
關于Authorization
的計算規則,首先需要申請API權限,得到clientId和clientSecret,姜這兩這個值按照client_id:client_secret
進行base64編碼,然后添加Basic
即可。
得到的json結構是這個樣子:
{
"access_token": "",
"token_type": "bearer",
"expires_in": 86399
}
可以看到,并沒有refresh_token
字段。所以,當token過期的時候,應該怎么刷新呢,那對于這種情況,只能重新請求了。
至于如果刷新token,那就得先登錄才可以獲取到了。下面就講一下如何進行登錄,及主要事項。
用戶登錄
用戶登錄的header和獲取token沒有區別,不過grant_type
取值為password
,另外還需要提供用戶名及密碼。
需要注意的是,用戶名和密碼需要進行RSA公鑰加密,然后進行base64編碼,至于公鑰,申請API權限的時候會有提供。
此時得到的json數據結構和上面有所不同:
{
"access_token": " ",
"token_type": "bearer",
"expires_in": 86399,
"refresh_token": " "
}
可以看到多了refresh_token
字段,那么這種情況下,當token過期后,就可以使用refresh_token
這種方式來獲取新的token,那如果refresh_token
也過期的話,就只能重新登錄了。下面就簡單說明一下刷新token的流程。
刷新Token
根據登錄后返回的refresh_token
,我們可以在token過期后,使用這個值來重新獲取token而無需重新登錄。
需要注意的是,header與之前有所不同,Authorization
的值為 Bearer
+access_token
的值。另外grant_type
取值為refresh_token
,還需要post一個字段是refresh_token
,也就是登錄時獲取的值。得到的json數據結構和登錄相同。
Content-Type:application/x-www-form-urlencoded
Authorization:Bearer .....
此文只是簡單介紹了一下博客園token獲取及刷新的基本邏輯及注意事項,也作拋磚引玉之用。后續會在Android
平臺上實現一個簡單的實例。