Json web token (JWT)
, 根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
#! /usr/bin/python3
# -*- encoding:utf8 -*-
import jwt #需要安装pip install pyjwt
import datetime, time
def createToken():
salt = 'abc@1234'
orgData = {
"version": "1.0",
"ts": "20210203123",
"serialId": "xxxxxx",
"hash": "xxxxxx",
}
payload = {
'userId': '001',
'userName': 'zhangsan',
"aud": "www.xxx.com",
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=1)
# exp 配置token有效时长
}
token = jwt.encode(payload=payload, key=salt, algorithm='HS256', headers=orgData)
print(token)
return token
def checkToken(token):
salt = 'abc@1234'
try:
# 如果在生成token的时候使用了aud参数,那么校验的时候也需要添加此参数
data = jwt.decode(token, salt, audience='www.xxx.com', algorithms=['HS256'])
return data
except jwt.ExpiredSignatureError:
return 'Token已失效'
except jwt.DecodeError:
return 'Token认证失败'
except jwt.InvalidTokenError:
return '无效的Token'
if __name__ == '__main__':
token = createToken()
print(checkToken(token))
time.sleep(60)
print(checkToken(token))
信息会暴露
:由于这里用的是可逆的base64 编码,所以第二部分的数据实际上是明文的。我们应该避免在这里存放不能公开的隐私信息。