摘要:的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該也可直接被用于認(rèn)證,也可被加密。
JWT認(rèn)證登錄
最近在做一個審核系統(tǒng),后臺登錄用到JWT登錄認(rèn)證,在此主要做個總結(jié)
JWT是什么Json web token (JWT), 根據(jù)官網(wǎng)的定義,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
為什么使用JWT此處主要和傳統(tǒng)的session作對比,傳統(tǒng)的session在服務(wù)器端需要保存一些登錄信息,通常是在內(nèi)存中,在后端服務(wù)器是集群等分布式的情況下,其他主機沒有保存這些信息,所以都需要通過一個固定的主機進(jìn)行驗證,如果用戶量大,在認(rèn)證這個點上容易形成瓶頸,是應(yīng)用不易拓展。
JWT原理JWT由三個部分組成,用點號分割,看起來像是這樣,JWT token本身沒有空格換行等,下面是為了美觀處理了下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19. m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
Header部分是一個json,描述JWT的元數(shù)據(jù),通常是下面這樣
{ "alg": "HS256", "typ": "JWT" }
alg表示簽名使用的的算法,默認(rèn)是HMAC SHA256,寫成HS256, tye表示這個token的類型,JWT token統(tǒng)一使用JWT,上面這段Header生成的token是
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
官方規(guī)定了7個字段,解釋如下
iss: 簽發(fā)人,可以填寫生成這個token的ID等等,可選參數(shù)
sub: 該JWT所面向的客戶,可以存儲用戶的account_id等等,可選
aud:該JWTtoken的接收方,可以填寫生成這個token的接口URL,但是不強制,可選
exp: 過期時間,時間戳,整數(shù),可選參數(shù)
iat:生成token的時間,unix時間,時間戳,可選參數(shù)
nbf(Not Before): 表示該token在此時間前不可用,驗證不通過的意思,可選
jti: JWT ID,主要用來生成一次性token,可選的參數(shù)
除了官方之外,我們還可以定義一部分自定義字段,但是考慮到BASE64是可逆的,所以不要放入敏感信息
下面是一個例子;
{ "iss": "labs_purifier-api-panel", "iat": 1552975878, "exp": 1555567878, "aud": "http://ff-labs_purifier-api-test.fenda.io/prod/v1/auth/jwt", "sub": "1501385611884704", "scopes": [ "register", "open", "login", "panel" ] }
上面這個Payload,經(jīng)過BASE64加密后,生成的token是
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
Signature是對前面兩部分生成的兩段token的加密,使用的加密方式是Header里面指定的,此處是HS256,此時,需要一個秘鑰,不可以泄露,大致過程如下:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)JWT的使用
JWT token 一般放在請求頭里面,當(dāng)然也可以放在cookie里面,但是放在cookie里面不可以跨域,例如:
Authorization: BearerJWT在Python中的簡單生成和驗證
jwt庫
生成token
def create_token(): payload={ "iss": "labs_purifier-api-panel", "iat": 1552975878, "exp": 1555567878, "aud": Config.AUDIENCE, "sub": "1501385611884704", "scopes": [ "register", "open", "login", "panel" ] } token = jwt.encode(payload, Config.SECRET_KEY, algorithm="HS256") return True, {"access_token": token}
驗證token
def verify_jwt_token(token): try: payload = jwt.decode(token, Config.SECRET_KEY, audience=Config.AUDIENCE, algorithms=["HS256"]) except (ExpiredSignatureError, DecodeError): return False, token if payload: return True, jwt_model
需要注意的是,如果在生成的時候,加上了aud參數(shù),驗證的時候也要用上audience參數(shù),并且值必須一樣
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43462.html
摘要:頭部需要一個頭部,用于描述關(guān)于該的最基本的信息,例如其類型以及簽名所用的算法等。簽發(fā)者需要準(zhǔn)備一個可以確認(rèn)自己身份的字符串,這個字符串我們稱之為。 什么是 jwt ? JWT 全稱叫 JSON Web Token, 是一個非常輕巧的規(guī)范。這個規(guī)范允許我們使用 JWT 在用戶和服務(wù)器之間傳遞安全可靠的信息。 jwt 使用場景 jwt 用圖廣泛,例如授權(quán)、鑒權(quán)等。具體一點的話,假如我們有一...
摘要:利用消息認(rèn)證碼可以確保消息不是被別人偽造的,消息認(rèn)證碼是帶密鑰的函數(shù),由于有了一個,所以會比有更好的安全性。所以需要采用的就是算法,該算法主要利用的是不對稱加密算法,利用私鑰進(jìn)行簽名,公鑰驗證數(shù)據(jù)的完整性。 寫在前面 本文會到你了解jwt的實現(xiàn)原理,以及base64編碼的原理。同時本人也簡單的實現(xiàn)了一下jwt的生成,點這里。 jwt是什么 本質(zhì)上它是一段簽名的 JSON 格式的數(shù)據(jù)。由...
摘要:認(rèn)證服務(wù)器,即服務(wù)提供商專門用來處理認(rèn)證的服務(wù)器。它與認(rèn)證服務(wù)器,可以是同一臺服務(wù)器,也可以是不同的服務(wù)器。客戶端使用上一步獲得的授權(quán),向認(rèn)證服務(wù)器申請令牌。認(rèn)證服務(wù)器對客戶端進(jìn)行認(rèn)證以后,確認(rèn)無誤,同意發(fā)放令牌。 最近想做個小程序,需要用到授權(quán)認(rèn)證流程。以前項目都是用的 OAuth2 認(rèn)證,但是Sanic 使用OAuth2 不太方便,就想試一下 JWT 的認(rèn)證方式。這一篇主要內(nèi)容是 ...
摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進(jìn)行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護(hù)REST API 重拾后端之Spring Boot(一):REST API的搭建...
閱讀 2401·2021-11-24 10:31
閱讀 3457·2021-11-23 09:51
閱讀 2277·2021-11-15 18:11
閱讀 2424·2021-09-02 15:15
閱讀 2482·2019-08-29 17:02
閱讀 2314·2019-08-29 15:04
閱讀 863·2019-08-29 12:27
閱讀 2891·2019-08-28 18:15