Python使用JWT的超詳細教程
一、JWT的介紹
JWT(JSON Web Tokens)是一種用于在網(wǎng)絡應用環(huán)境間安全地傳輸信息的簡潔的、URL安全的令牌標準。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
二、JWT的組成
JWT的結構分為三部分,它是用點來分割的,Header(頭部),Payload(負載),Signature(簽名)。如下圖
1、Header(頭部)
頭部通常包含了兩部分信息:聲明類型和使用什么算法,第一部分就是將json轉化為字符串,然后用Base64加密,如下格式
{ "alg":"HS256", "type":"jwt" }
2、Payload(負載)
負載里面通常就是我們要傳遞給前端的值,如用戶的一些信息啊,也是將json轉換為字符串,然后用Base64加密,如下格式
{ "id":"123", "username":"xiaoming" }
3、Signature(簽名)
簽名的作用是保證JWT的未被篡改。簽名的生成方式是將編碼后的頭部、編碼后的負載、秘密通過指定的算法進行簽名。簽名的作用是保證JWT的發(fā)送者不能抵賴自己發(fā)送的消息,接收者能夠驗證消息的完整性。這里是將前2部分的密文拼接起來,對這2部分進行HS256加密,然后加鹽,最后在對加密后的內容用Base64加密一次
三、Python寫JWT
1、安裝Jwt
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyJWT
2、使用JWT
import datetime import jwt def create_jwt(): headers = { 'alg': 'HS256', 'typ': 'JWT' } # jwt的頭部,包含了類型和算法的指定 payload = { "id": 123, "username": '小明', 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=12), } # jwt的負載,都是一些自定義值,其中exp中的內容是我們指定jwt的一個有效時間,有效時間為12個小時 token = jwt.encode(headers=headers, payload=payload, algorithm='HS256', key='123') # 對上面內容進行加密,這里的key就是加的鹽 print(token) if __name__ == '__main__': create_jwt()
3、解密JWT
import datetime import jwt def create_jwt(): headers = { 'alg': 'HS256', 'typ': 'JWT' } # jwt的頭部,包含了類型和算法的指定 payload = { "id": 123, "username": '小明', 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=12), } # jwt的負載,都是一些自定義值,其中exp中的內容是我們指定jwt的一個有效時間,有效時間為12個小時 token = jwt.encode(headers=headers, payload=payload, algorithm='HS256', key='123') # 對上面內容進行加密,這里的key就是加的鹽,是自定義的,我們在使用鹽的時候一般是唯一的一個值 print(token) return token def decode_JWT(token): content = jwt.decode(jwt=token, key='123', algorithms=['HS256']) # 對jwt進行解密,這里用的key必須和上面用的key一樣,否則是無法解密出來的 print(content) if __name__ == '__main__': token = create_jwt() decode_JWT(token)
解密出來的結果如下圖
總結
到此這篇關于Python使用JWT的文章就介紹到這了,更多相關Python使用JWT內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談python中的getattr函數(shù) hasattr函數(shù)
下面小編就為大家?guī)硪黄獪\談python中的getattr函數(shù) hasattr函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06Python mutiprocessing多線程池pool操作示例
這篇文章主要介紹了Python mutiprocessing多線程池pool操作,結合實例形式分析了Python多線程模塊multiprocessing進程池相關操作技巧,需要的朋友可以參考下2019-01-01非常詳細的Django連接mysql數(shù)據(jù)庫步驟記錄
我的Mysql中已經(jīng)有了項目需要使用的相關數(shù)據(jù)庫,現(xiàn)在需要通過django來獲取Mysql里的數(shù)據(jù)并使用,下面這篇文章主要給大家介紹了關于非常詳細的Django連接mysql數(shù)據(jù)庫步驟,需要的朋友可以參考下2022-10-10