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.cnblogs.com/shouke/p/14969107.html
图文来源于网络,如有侵权请联系删除。