Part1什么是 token
token
(也称令牌)就是一串字符,其作用是为了减轻频繁进行用户名和密码的验证而对服务器产生的压力。客户端首次访问通过正确的用户名和密码从服务端拿到 token
,之后客户端携带 token
即可完成验证,无需重复携带用户名和密码。
JWT
JWT
全名 json web token
,它是一种开放的标准,其带有数字签名,用于 json
对象的安全传输。
Part2怎么生成 token
我们已经知道 token
是一串字符,我们可以通过一些秘钥+用户名+时间戳等字符组合,使用 base64
对其进行加密,从而生成 token
颁发给客户端。然后对客户端携带的 token
进行解密,拿到秘钥,用户名,时间戳,最后对这些参数进行校验就可以判断 token
正确与否和是否过期。
以上为
token
生成的原理,在实际开发中,我们可以直接使用现成的第三方库(如:python-jose
)。
常用的 JWT 库
python-jose
pyjwt
jwcrypto
authlib
安装 JWT 库
pip install python-jose
生成 token
# 从jose导入jwt,后面使用jwt生成token
from jose import jwt
# 导入日期模块,用来验证token过期时间
from datetime import datetime,timedelta
# 定义秘钥,很重要,请勿泄露
SECRET_KEY = 'phyger'
# 生成token的代码,token过期时长定义为默认参数,单位为秒
def create_token(seconds=60):
# 定义token过期时间,为当前utc时间加上token有效期
expire = datetime.utcnow()+timedelta(seconds=seconds)
# 此处即为生成token的payload,sub自定义(可选用户名),uid自定义(可选设备id等)
# to_endoe可以是一个空的字典,但是不建议这样做
to_encode = {"exp":expire,"sub":SECRET_KEY,"uid":"123456"}
# 使用jwt生成token,token是根据payload和秘钥共同生成。
jwt_token = jwt.encode(claims=to_encode,key=SECRET_KEY)
return jwt_token
jose
的JWT
默认采用HS256
加密方式
运行代码
> python utm.py
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTI1MjY0OTgsInN1YiI6InBoeWdlciIsInVpZCI6IjEyMzQ1NiJ9.TnRFBFX_2Jn3VU26n603l5uOQyB9bOOWSxBQUr6tBA4
可以看到,token
已经生成。
完
往期推荐
点亮在看!