笔记"/>
JWT认证记录笔记
JWT认证记录笔记
- jwt构成
jwt由三段文本信息用.
拼接成 jwt token 字符串, 如下方格式
eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzI1NiJ9.eyJzdWIiOiAicm9vdCIsICJleHAiOiAxNjk5Nzc2Mzk4LCAiaWF0IjogMTY5OTc3Mjc5OCwgIm5hbWUiOiAid2FuZ3hpYW9taW5nIiwgImF2YXRhciI6ICIxLnBuZyIsICJ1c2VyX2lkIjogMSwgImFkbWluIjogdHJ1ZSwgImFjY19wd2QiOiAiUWlMQ0poYkdjaU9pSklVekkxTmlKOVFpTENKaGJHY2lPaUpJVXpJMU5pSjlRaUxDSmhiR2NpT2lKSVV6STFOaUo5In0=.405b472590234fb1babc4daffcb149d4b8855f03aaac2fa0b15672ebc36cc8b5
第一个部分为头部(header), 第二部分为载体(payload), 第三部分是签证(signature)
header
jwt的头部承载两部分信息:
- typ: 声明token类型,这里是jwt ,typ的值也可以是:Bear
- alg: 声明签证的加密的算法 通常直接使用 HMAC SHA256
{'typ':"JWT",'alg':'HS256'
}
python代码
import base64, json
header_data = {"typ": "jwt", "alg": "HS256"
}
header = base64.b64encode(json.dumps(header_data).encode()).decode()
print(header) # eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzI1NiJ9
payload
载荷就是存放有效信息的地方。有效信息包含三个部分:
- 标准声明
- 公共声明
- 私有声明
标准声明指定jwt实现规范中要求的属性。 (官方建议但不强制使用) :
- iss: jwt签发者
- sub: jwt所面向的用户
- aud: 接收jwt的一方
- exp: jwt的过期时间,这个过期时间必须要大于签发时间
- nbf: 定义在什么时间之后,该jwt才可以使用
- iat: jwt的签发时间
- jti: jwt的唯一身份标识,主要用来作为一次性token, 从而回避重放攻击。
公共声明 : 公共的声明可以添加任何的公开信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可直接读取.
私有声明 : 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,里面存放的是一些可以在服务端或者客户端通过秘钥进行加密和解密的加密信息。往往采用的RSA非对称加密算法。
python代码:
iat = int(time.time())
payload_data = {"sub": "root","exp": iat + 3600, # 假设一小时过期"iat": iat,"name": "wangxiaoming","avatar": "1.png","user_id": 1,"admin": True,"acc_pwd": "QiLCJhbGciOiJIUzI1NiJ9QiLCJhbGciOiJIUzI1NiJ9QiLCJhbGciOiJIUzI1NiJ9",}# 将其进行base64编码,得到JWT的第二部分。payload = base64.b64encode(json.dumps(payload_data).encode()).decode()print(payload)# eyJzdWIiOiAicm9vdCIsICJleHAiOiAxNjk5Nzc2Mzk4LCAiaWF0IjogMTY5OTc3Mjc5OCwgIm5hbWUiOiAid2FuZ3hpYW9taW5nIiwgImF2YXRhciI6ICIxLnBuZyIsICJ1c2VyX2lkIjogMSwgImFkbWluIjogdHJ1ZSwgImFjY19wd2QiOiAiUWlMQ0poYkdjaU9pSklVekkxTmlKOVFpTENKaGJHY2lPaUpJVXpJMU5pSjlRaUxDSmhiR2NpT2lKSVV6STFOaUo5In0=405b472590234fb1babc4daffcb149d4b8855f03aaac2fa0b15672ebc36cc8b5
signature
JWT的第三部分是一个签证信息,用于辨真伪,防篡改。这个签证信息由三部分组成:
- header (base64后的头部)
- payload (base64后的载荷)
- secret(保存在服务端的秘钥字符串,不会提供给客户端的,这样可以保证客户端没有签发token的能力)
python
# signature
secret = 'django-insecure-hbcv-y9ux0&8qhtkgmh1skvw#v7ru%t(z-#chw#9g5x1r3z=$p' # secret 在 django 项目中settings配置文件中获取
data = header + payload + secret # 秘钥绝对不能提供给客户端。
HS256 = hashlib.sha256()
HS256.update(data.encode('utf-8'))
signature = HS256.hexdigest()
print(signature) # 815ce0e4e15fff813c5c9b66cfc3791c35745349f68530bc862f7f63c9553f4b# jwt token 最终的生成
token = f"{header}.{payload}.{signature}"
print(token)
# eyJ0eXAiOiAiand0IiwgImFsZyI6ICJIUzI1NiJ9.eyJzdWIiOiAicm9vdCIsICJleHAiOiAxNjk5Nzc2Mzk4LCAiaWF0IjogMTY5OTc3Mjc5OCwgIm5hbWUiOiAid2FuZ3hpYW9taW5nIiwgImF2YXRhciI6ICIxLnBuZyIsICJ1c2VyX2lkIjogMSwgImFkbWluIjogdHJ1ZSwgImFjY19wd2QiOiAiUWlMQ0poYkdjaU9pSklVekkxTmlKOVFpTENKaGJHY2lPaUpJVXpJMU5pSjlRaUxDSmhiR2NpT2lKSVV6STFOaUo5In0=.405b472590234fb1babc4daffcb149d4b8855f03aaac2fa0b15672ebc36cc8b5
更多推荐
JWT认证记录笔记
发布评论