在《Flask Web开发实战》中的第9章 图片社交网站和第10章代办程序事项中都需要用到itsdangrous中的TimedJSONWebSignatureSerializer来生成和校验令牌,但在itsdangrous的2.0版本后该方法被弃用,对此有什么好的替代方案吗?
目前我的解决方案是继续使用1.0的版本,但我使用的flask版本是2.1.2;当我强行安装itsdangrous的1.1.0版本后命令行给了如下报错
JWS support (
JSONWebSignatureSerializer
,TimedJSONWebSignatureSerializer
) is deprecated. Use a dedicated JWS/JWT library such as authlib instead
JWS/JWT 推荐用专门的库,比如:
1 个赞
好的 谢谢。我看了下PyJWT的文档决定就使用它了,发现itsdangerous也是在PyJWT上进行了封装,尽管使用PyJWT要比直接使用TimedJSONWebSignatureSerializer麻烦一些,但这也是一个不错的解决方案
如果用 Authlib 的话可以参考这个示例:
好的,谢谢辉哥
1 个赞
这不是 andyzhou 的好事?
欸嘿,这不是我写的嘛
1 个赞
grey, 请问这种方式我感觉不含过期时间,原先 [itsdangrous中TimedJSONWebSignatureSerializer] 包含过期时间的。
可以手动在payload里添加过期时间的,然后在解析的时候读取一下就行
OK,谢谢,有没有写好的demo.
大概是这样的一段代码:
from datetime import datetime, timedelta
from flask import current_app
from authlib.jose import JsonWebToken
from authlib.jose.errors import (ExpiredTokenError, DecodeError)
from werkzeug.exceptions import NotFound as _NotFound
from app.lib.exceptions import AuthFailed, Forbidden, NotFound
jwt = JsonWebToken(['HS256'])
def generate_auth_token(uid, ac_type, expiration=None):
header = {'alg':'HS256'}
if not expiration:
expiration = current_app.config['TOKEN_EXPIRATION']
exp = datetime.utcnow() + timedelta(seconds=expiration)
payload = {"uid": uid,"type": ac_type, 'exp':exp}
key = current_app.config["SECRET_KEY"]
token = jwt.encode(header, payload, key)
return token
def verify_auth_token(token):
from app.models import User
key = current_app.config["SECRET_KEY"]
try:
data = jwt.decode(token, key)
data.validate()
except ExpiredTokenError:
raise AuthFailed(message="The token is expired", msg_code=1003)
except DecodeError:
raise AuthFailed(message="The token is invalid", msg_code=1002)
try:
user = User.query.get_or_404(data['uid'])
except (KeyError, _NotFound):
raise NotFound('The key not found in the token')
return user
2 个赞