Python JWT認(rèn)證與pyjwt包詳細(xì)介紹
JWT是一種JSON的行業(yè)標(biāo)準(zhǔn),廣泛應(yīng)用在系統(tǒng)的用戶認(rèn)證方面。
JWT認(rèn)證簡介
JWT(JSON Web Tokens),是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種開放的行業(yè)標(biāo)準(zhǔn)(RFC7519)。該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
構(gòu)成
JWT就是由三段信息構(gòu)成,通過點(diǎn)號.
連接的一段字符串,如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoidGVzdCIsImV4cCI6MTY4NDQwOTE4MH0.K-nvXX3kS0I0RKny0J33tuns7SFttYhQwAUtqOS40aw
第一部分為頭部(header,base64編碼):
- 聲明類型:jwt;
- 聲明加密算法:如’HS256’。
{ 'typ': 'JWT', 'alg': 'HS256' }
第二部分為載荷(payload,base64編碼),存放認(rèn)證信息、有效期等:
{ "user_id":"test", "exp":1684410152 }
第三部是簽名(使用第一部分聲明的算法進(jìn)行HASH處理),Hash內(nèi)容:
- header (base64后的)
- payload (base64后的)
- secret:加密鹽
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
載荷聲明
標(biāo)準(zhǔn)中注冊的payload聲明 (建議但不強(qiáng)制使用) :
- iss: jwt簽發(fā)者;
- sub: jwt所面向的用戶;
- aud: 接收jwt的一方;
- exp: jwt的過期時(shí)間,這個(gè)過期時(shí)間必須要大于簽發(fā)時(shí)間;過期解碼會拋出ExpiredSignatureError異常;
- nbf: 定義在什么時(shí)間之前,該jwt都是不可用的;在此時(shí)間之前解碼會拋出ImmatureSignatureError異常;
- iat: jwt的簽發(fā)時(shí)間;在此時(shí)間之前解碼會拋出InvalidIssuedAtError異常;
- jti: jwt的唯一身份標(biāo)識,主要用來作為一次性token,從而回避重放攻擊。
注意:不要在jwt的payload部分存放敏感信息,該部分是客戶端可加碼的。
pyjwt
使用前先安裝pip install pyjwt
。
編解碼
在pyjwt中通過encode進(jìn)行編碼,通過decode進(jìn)行解碼。
import jwt JWT_TOKEN_EXPIRE_SECONDS = 3600 * 2 # token有效時(shí)間 2小時(shí) JWT_TOKEN_SECRET_SALT = 'salt.2023.05.18' JWT_TOKEN_ALGORITHM = 'HS256' # HASH算法 def generate_jwt_token(user: str) -> str: """根據(jù)用戶id生成token""" data = {'user_id': user, 'exp': int(time.time()) + JWT_TOKEN_EXPIRE_SECONDS} print("generate data:", data) jwtToken = jwt.encode(data, JWT_TOKEN_SECRET_SALT, algorithm=JWT_TOKEN_ALGORITHM) return jwtToken def verify_jwt_token(user: str, jwtToken: str) -> bool: """驗(yàn)證用戶token""" data = {'user_id': user} try: payload = jwt.decode(jwtToken, JWT_TOKEN_SECRET_SALT, algorithms=[JWT_TOKEN_ALGORITHM]) print("verify:", payload) exp = int(payload.pop('exp')) if time.time() > exp: print('已失效') return False return data == payload except jwt.exceptions.ExpiredSignatureError as ex: print('token簽名過期:', ex) except jwt.PyJWTError as ex: print('token解析失敗:', ex) return False
flask中驗(yàn)證
flask是一個(gè)輕量級的web框架,可方便與jwt結(jié)合進(jìn)行驗(yàn)證。
先定義一個(gè)修飾器(token通過header來攜帶):
from flask import Flask, request from functools import wraps def request_token_validate(f): @wraps(f) def toValidate(*args, **kwargs): token = request.headers.get('Authorization') if not token: logger.error("token invalid") return {'data': 'Token invalid'}, status.HTTP_401_UNAUTHORIZED return f(*args, **kwargs) return toValidate
在需要的route上添加驗(yàn)證修飾器:
@app.route("/users", methods=["GET"]) @request_token_validate def query_models(): userList = [] # get user list response_data = {"data": userList} return response_data, status.HTTP_200_OK
到此這篇關(guān)于Python JWT認(rèn)證與pyjwt包簡介的文章就介紹到這了,更多相關(guān)JWT認(rèn)證與pyjwt包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中JWT用戶認(rèn)證的實(shí)現(xiàn)
- Python 基于jwt實(shí)現(xiàn)認(rèn)證機(jī)制流程解析
- Python 身份驗(yàn)證和授權(quán)庫使用詳解(python jwt庫)
- python-jwt用戶認(rèn)證食用教學(xué)的實(shí)現(xiàn)方法
- Python JWT 介紹和使用詳解
- Python?PyJWT庫簡化JSON?Web?Token的生成與驗(yàn)證
- Python使用JWT的超詳細(xì)教程
- Python結(jié)合jwt實(shí)現(xiàn)登錄權(quán)限校驗(yàn)認(rèn)證
- Python實(shí)現(xiàn)JWT加解密的示例代碼
相關(guān)文章
pytorch 計(jì)算Parameter和FLOP的操作
這篇文章主要介紹了pytorch 計(jì)算Parameter和FLOP的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03在matplotlib的圖中設(shè)置中文標(biāo)簽的方法
今天小編就為大家分享一篇在matplotlib的圖中設(shè)置中文標(biāo)簽的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡
這篇文章主要介紹了python實(shí)現(xiàn)mysql的讀寫分離及負(fù)載均衡 ,需要的朋友可以參考下2018-02-02Python 將RGB圖像轉(zhuǎn)換為Pytho灰度圖像的實(shí)例
下面小編就為大家?guī)硪黄狿ython 將RGB圖像轉(zhuǎn)換為Pytho灰度圖像的實(shí)例。具有很好的參考價(jià)值。希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11