摘要:的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該也可直接被用于認證,也可被加密。
JWT認證登錄
最近在做一個審核系統,后臺登錄用到JWT登錄認證,在此主要做個總結
JWT是什么Json web token (JWT), 根據官網的定義,是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準.該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
為什么使用JWT此處主要和傳統的session作對比,傳統的session在服務器端需要保存一些登錄信息,通常是在內存中,在后端服務器是集群等分布式的情況下,其他主機沒有保存這些信息,所以都需要通過一個固定的主機進行驗證,如果用戶量大,在認證這個點上容易形成瓶頸,是應用不易拓展。
JWT原理JWT由三個部分組成,用點號分割,看起來像是這樣,JWT token本身沒有空格換行等,下面是為了美觀處理了下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9. eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19. m0HD1SUd30TWKuDQImwjIl9a-oWJreG7tKVzuGVh7e4
Header部分是一個json,描述JWT的元數據,通常是下面這樣
{ "alg": "HS256", "typ": "JWT" }
alg表示簽名使用的的算法,默認是HMAC SHA256,寫成HS256, tye表示這個token的類型,JWT token統一使用JWT,上面這段Header生成的token是
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
官方規定了7個字段,解釋如下
iss: 簽發人,可以填寫生成這個token的ID等等,可選參數
sub: 該JWT所面向的客戶,可以存儲用戶的account_id等等,可選
aud:該JWTtoken的接收方,可以填寫生成這個token的接口URL,但是不強制,可選
exp: 過期時間,時間戳,整數,可選參數
iat:生成token的時間,unix時間,時間戳,可選參數
nbf(Not Before): 表示該token在此時間前不可用,驗證不通過的意思,可選
jti: JWT ID,主要用來生成一次性token,可選的參數
除了官方之外,我們還可以定義一部分自定義字段,但是考慮到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,經過BASE64加密后,生成的token是
eyJpc3MiOiJsYWJzX3B1cmlmaWVyLWFwaS1wYW5lbCIsImlhdCI6MTU1Mjk3NTg3OCwiZXhwIjoxNTU1NTY3ODc4LCJhdWQiOiJodHRwOi8vZmYtbGFic19wdXJpZmllci1hcGktdGVzdC5mZW5kYS5pby9wcm9kL3YxL2F1dGgvand0Iiwic3ViIjoiMTUwMTM4NTYxMTg4NDcwNCIsInNjb3BlcyI6WyJyZWdpc3RlciIsIm9wZW4iLCJsb2dpbiIsInBhbmVsIl19
Signature是對前面兩部分生成的兩段token的加密,使用的加密方式是Header里面指定的,此處是HS256,此時,需要一個秘鑰,不可以泄露,大致過程如下:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)JWT的使用
JWT token 一般放在請求頭里面,當然也可以放在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參數,驗證的時候也要用上audience參數,并且值必須一樣
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43462.html
摘要:頭部需要一個頭部,用于描述關于該的最基本的信息,例如其類型以及簽名所用的算法等。簽發者需要準備一個可以確認自己身份的字符串,這個字符串我們稱之為。 什么是 jwt ? JWT 全稱叫 JSON Web Token, 是一個非常輕巧的規范。這個規范允許我們使用 JWT 在用戶和服務器之間傳遞安全可靠的信息。 jwt 使用場景 jwt 用圖廣泛,例如授權、鑒權等。具體一點的話,假如我們有一...
摘要:利用消息認證碼可以確保消息不是被別人偽造的,消息認證碼是帶密鑰的函數,由于有了一個,所以會比有更好的安全性。所以需要采用的就是算法,該算法主要利用的是不對稱加密算法,利用私鑰進行簽名,公鑰驗證數據的完整性。 寫在前面 本文會到你了解jwt的實現原理,以及base64編碼的原理。同時本人也簡單的實現了一下jwt的生成,點這里。 jwt是什么 本質上它是一段簽名的 JSON 格式的數據。由...
摘要:認證服務器,即服務提供商專門用來處理認證的服務器。它與認證服務器,可以是同一臺服務器,也可以是不同的服務器。客戶端使用上一步獲得的授權,向認證服務器申請令牌。認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌。 最近想做個小程序,需要用到授權認證流程。以前項目都是用的 OAuth2 認證,但是Sanic 使用OAuth2 不太方便,就想試一下 JWT 的認證方式。這一篇主要內容是 ...
摘要:框架具有輕便,開源的優點,所以本譯見構建用戶管理微服務五使用令牌和來實現身份驗證往期譯見系列文章在賬號分享中持續連載,敬請查看在往期譯見系列的文章中,我們已經建立了業務邏輯數據訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
閱讀 2374·2021-11-24 10:31
閱讀 3427·2021-11-23 09:51
閱讀 2239·2021-11-15 18:11
閱讀 2387·2021-09-02 15:15
閱讀 2452·2019-08-29 17:02
閱讀 2285·2019-08-29 15:04
閱讀 831·2019-08-29 12:27
閱讀 2853·2019-08-28 18:15