JWT簡介
JWT(Json web token),是為了在網路應用環境間傳遞宣告而執行的一種基于JSON的開放標準,JWT提供了一種簡單、安全的身份認證方法,特別適合分布式站點單點登錄、或者是簽名,
JWT構成
JWT是由3部分資訊組成,分別為header,payload,signature,組合形式為:header.payload.signature(注意:這里的header,payload,signature都是經過base64加密的值)
header
格式如下:
{
'typ': 'JWT', # 宣告型別
'alg': 'RS256' # 宣告加密演算法 # RSA Signature withSHA-256
}
要構成JWT組成部分之前,需要對其進行base64加密,得到一字串,形如:eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9
payload
payload用于存放有效資訊,可劃分為三部分,
-
標準宣告
-
公共宣告
-
私有宣告
標準宣告(建議但不強制使用)
-
iss:issue,JWT簽發者 -
sub:subject,主題 -
aud:audience,受眾,該JWT所面向的用戶 -
exp:JWT過期時間戳,單位秒,這個過期時間必須要大于簽發時間 -
nbf:定義在什么時間之前,該JWT都是不可用的 -
iat:JWT簽發時間 -
jti:JWT的唯一身份標識,主要用來作為一次性token,從而避免重放攻擊,
公共宣告
公共宣告可以添加任何的資訊,一般添加用戶的相關資訊或其他業務需要的必要資訊,一般不建議添加敏感資訊,因為該部分在客戶端可解密,
私有宣告
私有宣告是提供者和消費者所共同定義的宣告,一般不建議添加敏感資訊,因為該部分在客戶端也是可解密,
格式如下
{
"iss":"shouke",
"sub":"test_subject",
"aud":"tester",
"iat":1624499492,
"exp":1624535491,
"jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",
"username":"shouke",
"hobby":"unknow"
}
同header一樣,要構成JWT組成部分之前,需要對其進行base64加密,得到一字串,形如:
eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=
signature
header,payload構成了signature基礎資訊,格式為:header.payload,其中header和payload,也是base64加密后的值,
構成JWT組成部分之前,需要采用header中alg配置對應的演算法,對上述基礎資訊進行加密,然后對加密結果進行base64編碼,得到最終的signature,
L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=
最后,將以上三部分用.連接起來,得到JWT,如下
eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9.eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=.L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=
代碼實作
import rsa
import base64
import json
import shortuuid
from datetime import datetime, timedelta
def make_jwt():
header = { 'typ': 'JWT', # 令牌型別
'alg': 'RS256' # 使用的演算法 # RSA Signature withSHA-256
}
header = base64.b64encode(json.dumps(header).encode()).decode() # encode decode 默認使用utf-8
print(header)
payload = {
"iss":"cassmall.com",
"sub":"mandy",
"aud":"cassmall",
"iat":int(datetime.now().timestamp()),
"exp":int((datetime.now()+ timedelta(seconds=31536000)).timestamp()), # JWT過期時間戳,單位秒
"jti":shortuuid.uuid(),
"username":"shouke",
"hobby":"unknow"
}
payload = base64.b64encode(json.dumps(payload).encode()).decode()
print(payload)
signature = genrate_signature(1024, '{header}.{payload}'.format(header=header, payload=payload).encode('utf-8'), 'SHA-256')
print(signature)
return '{header}.{payload}.{signature}'.format(header=header,
payload=payload,
signature=signature)
def genrate_signature(nbits, message, hash_method):
(pubkey, privkey) = rsa.newkeys(nbits)
if not isinstance(message, bytes):
message = message.encode('utf-8')
hash = rsa.compute_hash(message, hash_method)
return base64.b64encode(rsa.sign(hash, privkey, hash_method)).decode()
if __name__ == '__main__':
print(make_jwt())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288907.html
標籤:Python
下一篇:Python基礎之GUI編程
