一、背景說明
需求是這樣滴:對物聯網終端設備以及網關設備進行統一的管理,這裏需要一個設備管理平臺,同時呢,計劃開放API,以供應用開發者調用API來管理控制設備。設備管理平臺本身的用的是傳統的session來管理,設備管理者數量並不多,所以不會有超量的session給服務器造成太大的壓力。開放API給第三方應用用戶是爲了應對第三方用戶開發的各種移動端app以及需要自身維護的設備管理。所以用session就不是那麼合適,計劃採取token的方式。
多年以前我用過token這種方式來開發,那時候似乎還沒有jwt這個框架,我記得是根據用戶名密碼生成token後存在數據庫中的,每次token進來是需要從數據庫中或者提前緩存的token池中來找到匹配的token以確保不是非法請求。
閒話多了,看看正題。
二、JWT以及JJWT介紹
首先呢,我們可以通過這裏來看看JWT是個什麼樣的東西:https://jwt.io/introduction/ 官方說的很清楚了,我就用我蹩腳的英文來給大家解釋下:
1、什麼是JSON Web Token?
JSON Web Token (JWT)是一個開放的標準(RFC 7519),它定義了一種簡潔獨立的方式,以JSON對象的形式在各方之間安全地傳輸信息。
2、什麼時候使用JWT呢?
授權和信息交換的時候
3、JWT結構介紹
JWT說白了,就是一串字符串,包含三個部分,三部分之間用“.”來分割。三部分分別是:
- Header
- Payload
- Signature
最後形成的字符串就像這樣:xxxxx.yyyyy.zzzzz
Header大概就是這樣的:
{
"alg": "HS256",
"typ": "JWT"
}
payload就是放內容的,官方叫做claims,這個是啥玩意呢?這玩意是聲明一些實體,包括jwt自己已經定義好的特色的聲明,還有一些用戶加上的聲明(我們這些開發者想加上的)以及一些附加數據
這玩意有三種類型,分別是 registered, public, and private claims. Registered Claims就是官方已經定義了的,比如:iss (issuer), exp (expiration time), sub (subject), aud(audience) public呢,就是自己可以隨意定義了,要注意避免命名空間的衝突,https://www.iana.org/assignments/jwt/jwt.xhtml。private就是幾方之間約定的,沒有註冊public的claims。感覺說多了自己都暈。
說白了就是一些key value,大概是這個樣子的:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
signature是簽名嘍,就是你要發這些,你籤個字再發,大概就是這個樣子滴。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
最終形成這麼個玩意:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
三、和springboot整合
待續啊,睡覺了先。
四、排除shiro控制