Python_JWT_通常用于身份验证和信息交换
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。JWT 通常用于身份验证和信息交换
Jwt由三部分组成,用dian(.)分割
- Header(头部)
- Payload(负载)
- Signature(签名)
Header(头部):
描述 JWT 的元数据,通常包括两个部分:
typ:指定令牌的类型,通常是 JWT。
alg:指定签名使用的算法,如 HS256(HMAC SHA256)或 RS256(RSA SHA256)。
{
"alg": "HS256",
"typ": "JWT"
}
Payload(负载):
包含声明(claims),即关于实体(通常是用户)和其他数据的声明。
声明分为三种:
Registered Claims:预定义的声明,不是强制性的,但推荐使用,例如 iss(发行者)、sub(主题)、aud(受众)、exp(过期时间)、nbf(生效时间)、iat(签发时间)、jti(JWT ID)。
Public Claims:可以由使用 JWT 的各方自定义,但为了避免冲突,建议在命名空间中定义。
Private Claims:用于在同意使用它们的各方之间共享信息,既不是注册声明也不是公开声明。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature(签名):
用于验证消息在整个传输过程中没有被篡改。
签名的计算方式:
使用 Base64Url 编码的 Header 和 Payload。
使用密钥(对于 HMAC 算法)或公钥/私钥对(对于 RSA 算法)。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
工作流程
1.认证
用户向服务器发送用户名和密码
服务器验证凭据
如果验证成功,服务器返回一个JWT
2.授权
客户端将jwt存储在本地
客户端在后续请求中将JWT包含在请求头中(通常是 Authorization: Bearer
服务器验证jwt的有效性(签名,过期时间等)
如果有效,服务器处理请求并返回响应
示例
import jwt
import datetime
class Token:
def __init__(self):
self.secret_key = 'luckyletop'
# 加密
def encode(self,data):
return jwt.encode(data,self.secret_key,algorithm='HS256')
# 带生命周期的token
def encode_time(self,data,seconds=30):
# 提前定义载荷信息
playload = {
"exp":int((datetime.datetime.now()+datetime.timedelta(seconds=seconds)).timestamp()),
"data":data
}
return jwt.encode(playload,self.secret_key,algorithm='HS256')
# 解密
def decode(self,token):
data = jwt.decode(token,self.secret_key,algorithms=['HS256'])
return data
if __name__ == '__main__':
token_instance = Token()
encode_token = token_instance.encode({'username':'luckyletop@163.com','password':'123456'})
decode_token = token_instance.decode(encode_token)