JWT在身份認證方面的應用

JWT,Json web token。因為在項目中準備應用,總結下,理清思路,希望對團隊有幫助。除簡介外,都融合了我個人的理解,不希望對別人產生誤導。網絡讓自媒體很容易,一定加以分析,全盤照收是很危險的;即使是讀書,也要分析,盡信書不如無書。

簡介

參考《jwt簡介》,我認為很基礎,原文翻譯,比較客觀,就不重復了。

JWT應用場景?

簡介中提到兩個場景,我認為主要第一種--身份認證。為什么采用這種方式呢?我總結了下

1、json格式簡單,相比xml,我更喜歡json;Self-contained,一般都翻譯成自包含,意思是jwt中已經有了你需要的全部信息,拿出來用就行。

2、同session相比,性能更好一些,省去了處理分布session的問題;對于大行其道的restful來講,支持得很好;瀏覽器+app+pc,這種多終端開發,是很好的選擇。

如果可以,新系統不再使用session保存用戶信息。對于我們自己的platina開發平臺,可以平滑過渡到jwet,讓開發人員感覺不到。

JWT有什么好處?

1、支持跨域訪問: Cookie是不允許垮域訪問的,這一點對Token機制是不存在的,前提是傳輸的用戶認證信息通過HTTP頭傳輸.

2、無狀態(也稱:服務端可擴展行):Token機制在服務端不需要存儲session信息,因為Token 自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質存儲狀態信息.

4、更適用CDN: 可以通過內容分發網絡請求你服務端的所有資料(如:javascript,HTML,圖片等),而你的服務端只要提供API即可.

5、去耦: 不需要綁定到一個特定的身份驗證方案。Token可以在任何地方生成,只要在你的API被調用的時候,你可以進行Token生成調用即可.

6、更適用于移動應用: 當你的客戶端是一個原生平臺(iOS, Android,Windows 8等)時,Cookie是不被支持的(你需要通過Cookie容器進行處理),這時采用Token認證機制就會簡單得多。

7、CSRF:因為不再依賴于Cookie,所以你就不需要考慮對CSRF(跨站請求偽造)的防范。

8、性能: 一次網絡往返時間(通過數據庫查詢session信息)總比做一次HMACSHA256計算 的Token驗證和解析要費時得多.

9、不需要為登錄頁面做特殊處理: 如果你使用Protractor 做功能測試的時候,不再需要為登錄頁面做特殊處理.

10、基于標準化:你的API可以采用標準化的 JSON Web Token (JWT). 這個標準已經存在多個后端庫(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft).

流程

1、用戶認證。認證方式可能很多,自己認證或者sso。

2、認證后,服務器構造JWT。

3、把JWT返回客戶端,客戶端存儲。

4、客戶端訪問服務器,帶上JWT。

5、服務器端判斷JWT是否正確并且沒有超時,正常,向下流轉;否則,轉到授權。

服務器端

服務器端主要有2件事,我結合java說明下,j wt.io上介紹了幾個java類庫,根據個人喜好選擇。之前使用一個sso,用Nimbus,也支持jwt,但是他卻依賴net.minidev.json.JSONObject,就放棄了;后來采用jjwt,依賴jackson。

1、生成jwt

1.1、生成jwt的時機,認證之后,返回認證結果之前。

1.2、Payload(很多翻譯是直譯,對于理解沒有任何幫助)中如何設計屬性,這個對于可讀性比較重要。

根據JWT的標準,這些claims可以分為以下三種類型:

a. Reserved claims(保留),它的含義就像是編程語言的保留字一樣,屬于JWT標準里面規定的一些claim。JWT標準里面定好的claim有:

iss(Issuser):代表這個JWT的簽發主體;

sub(Subject):代表這個JWT的主體,即它的所有人;

aud(Audience):代表這個JWT的接收對象;

exp(Expiration time):是一個時間戳,代表這個JWT的過期時間;

nbf(Not Before):是一個時間戳,代表這個JWT生效的開始時間,意味著在這個時間之前驗證JWT是會失敗的;

iat(Issued at):是一個時間戳,代表這個JWT的簽發時間;

jti(JWT ID):是JWT的唯一標識。

b. Public claims,略(不重要)

c. Private claims,這個指的就是自定義的claim。比如前面那個結構舉例中的admin和name都屬于自定的claim。這些claim跟JWT標準規定的claim區別在于:JWT規定的claim,JWT的接收方在拿到JWT之后,都知道怎么對這些標準的claim進行驗證;而private claims不會驗證,除非明確告訴接收方要對這些claim進行驗證以及規則才行。

1.3、生成jwt的代碼

SecretKeySpec key = getKey();//getKey自己處理

Map claims = new HashMap();

claims.put("uid", userInfo.getAccountId()+"");

claims.put("user_name", userInfo.getUserName());

claims.put("nick_name",userInfo.getUserAttribute(PlatinaUser.NICK_NAME));

JwtBuilder builder = Jwts.builder()

.setClaims(claims)----一定先于下面的set方法,否則覆蓋。

.setIssuer("bmtech.com")

.setSubject(userInfo.getUserNum())

.setNotBefore(now)

.signWith(signatureAlgorithm, key);

return builder.compact();

2、處理jwt

Jwtjwt = Jwts.parser().setSigningKey(getKey()).parse(token);

Claims claims =? jwt.getBody();

客戶端

jwt存儲方式自己靈活掌握。

web:cookie/localStorage/sessionStorage/;

app:內存

安全

JWT是否安全?

既然jwt被很多大型公司采用,安全性一定是有保證的。

要保證私鑰的安全性,來保障簽名的安全。

有人提到jwt暴露簽名算法(alg),而且會有None(無簽名),所以建議隱去alg。一般的協議制定都會考慮擴展性和普適性。但是我們在應用中可以采用我們默認的算法,而不是根據alg去處理。

常見安全問題及處理?

1、XSS(Cross Site Script)

把token存儲在cookie中,同時設置httpOnly。

2、CSRF(cross-site request forgery)

2.1、判斷reffer。系統改動最小,通過filter就可以完成。

2.2、在參數中傳token。

2.3、通過header傳遞token。(推薦)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容