摘要:詳細介紹可以查看這篇文章理解認(rèn)證及實踐特點優(yōu)點體積小,因而傳輸速度快傳輸方式多樣,可以通過參數(shù)頭部等方式傳輸嚴(yán)格的結(jié)構(gòu)化。
Json web token (JWT), 根據(jù)官網(wǎng)的定義,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。JWT 特點 優(yōu)點
詳細介紹可以查看這篇文章 理解JWT(JSON Web Token)認(rèn)證及實踐
體積小,因而傳輸速度快
傳輸方式多樣,可以通過URL/POST參數(shù)/HTTP頭部等方式傳輸
嚴(yán)格的結(jié)構(gòu)化。它自身(在 payload 中)就包含了所有與用戶相關(guān)的驗證消息,如用戶可訪問路由、訪問有效期等信息,服務(wù)器無需再去連接數(shù)據(jù)庫驗證信息的有效性,并且 payload 支持為你的應(yīng)用而定制化。
支持跨域驗證,可以應(yīng)用于單點登錄。
存在的問題JWT 自身(在 payload 中)就包含了所有與用戶相關(guān)的驗證消息,所以通常情況下不需要保存。這種設(shè)計存在幾個問題:
Token不能撤銷--客戶端重置密碼后之前的JWT依然可以使用(JWT 并沒有過期或者失效
不支持refresh token,JWT過期后需要執(zhí)行登錄授權(quán)的完整流程
無法知道用戶簽發(fā)了幾個JWT
針對第一個問題,可能的解決方法有:
保存JWT到數(shù)據(jù)庫(或Redis),這樣可以針對每個JWT多帶帶校驗
在重置密碼等需要作廢之前全部JWT時,把操作時間點記錄到數(shù)據(jù)庫(或Redis),校驗JWT時同時判斷此JWT創(chuàng)建之后有沒有過重置密碼等類似操作,如果有校驗不通過
當(dāng)然,這種解決方法都會多一次數(shù)據(jù)庫請求,JWT自身可校驗的優(yōu)勢會有所減少,同時也會影響認(rèn)證效率。
這篇文章主要介紹解決第二個問題(不支持refresh token)的思路。
refresh tokenrefresh token是OAuth2 認(rèn)證中的一個概念,和OAuth2 的access token 一起生成,表示更新令牌,過期所需時間比access toen 要長,可以用來獲取下一次的access token。
如果JWT 需要添加 refresh token支持,refresh token需要滿足的條件有一下幾項:
和JWT一起生成返回給客戶端
有實效時間,有效時間比JWT要長
只能用來換取下一次JWT,不能用于訪問認(rèn)證
不能重復(fù)使用(可選)
refresh token 獲取流程 refresh token 使用流程 代碼示例import jwt import time # 使用 sanic 作為restful api 框架 def create_token(account_id, username): payload = { "iss": "gusibi.mobi", "iat": int(time.time()), "exp": int(time.time()) + 86400 * 7, "aud": "www.gusibi.mobi", "sub": account_id, "username": username, "scopes": ["open"] } token = jwt.encode(payload, "secret", algorithm="HS256") payload["grant_type"] = "refresh" refresh_token = jwt.encode(payload, "secret", algorithm="HS256") return True, { "access_token": token, "account_id": account_id, "refresh_token": refresh_token } # 驗證refresh token 出否有效 def verify_refresh_token(token): payload = jwt.decode(token, "secret", audience="www.gusibi.com", algorithms=["HS256"]) # 校驗token 是否有效,以及是否是refresh token,驗證通過后生成新的token 以及 refresh_token if payload and payload.get("grant_type") == "refresh": # 如果需要標(biāo)記此token 已經(jīng)使用,需要借助redis 或者數(shù)據(jù)庫(推薦redis) return True, payload return False, None # 驗證token 是否有效 def verify_bearer_token(token): # 如果在生成token的時候使用了aud參數(shù),那么校驗的時候也需要添加此參數(shù) payload = jwt.decode(token, "secret", audience="www.gusibi.com", algorithms=["HS256"]) # 校驗token 是否有效,以及不能是refresh token if payload and not payload.get("grant_type") == "refresh": return True, payload return False, None參考鏈接
理解JWT(JSON Web Token)認(rèn)證及實踐
理解OAuth 2.0[1]
References
[1] 理解OAuth 2.0: http://www.ruanyifeng.com/blo...
最后,感謝女朋友支持和包容,比??
也可以在公號輸入以下關(guān)鍵字獲取歷史文章:公號&小程序 | 設(shè)計模式 | 并發(fā)&協(xié)程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43678.html
摘要:問題如何將新的發(fā)給前端比較好這個問題答案簡單,在的中設(shè)置。我這里使用解決的,將舊作為鍵,新作為值,設(shè)置一個秒過期的時間。大家可以享用這個新版,可以很好解決這個問題。 前后端分離,使用token的方式校驗用戶信息,我選擇了jwt,使用的教程在網(wǎng)上可以找到很多,不做介紹。 這里說明一個使用過程中,最重要的的一個環(huán)節(jié)刷新token帶來的問題。 業(yè)務(wù)要達到的目標(biāo): 用戶登錄一次之后,前端保存t...
摘要:自己在前后端分離上的實踐要想實現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)管理,這次實踐包含兩個模塊基于搭建的權(quán)限管理系統(tǒng)后臺編寫的前端管理。 自己在前后端分離上的實踐 要想實現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)restful api管理,這次實踐包含兩個模塊,基于springBoot + shiro搭建的權(quán)限管理系統(tǒng)后臺bootshir...
摘要:自己在前后端分離上的實踐要想實現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)管理,這次實踐包含兩個模塊基于搭建的權(quán)限管理系統(tǒng)后臺編寫的前端管理。 自己在前后端分離上的實踐 要想實現(xiàn)完整的前后端分離,安全這塊是繞不開的,這個系統(tǒng)主要功能就是動態(tài)restful api管理,這次實踐包含兩個模塊,基于springBoot + shiro搭建的權(quán)限管理系統(tǒng)后臺bootshir...
閱讀 1496·2023-04-26 01:28
閱讀 3315·2021-11-22 13:53
閱讀 1420·2021-09-04 16:40
閱讀 3189·2019-08-30 15:55
閱讀 2678·2019-08-30 15:54
閱讀 2489·2019-08-30 13:47
閱讀 3368·2019-08-30 11:27
閱讀 1146·2019-08-29 13:21