itsdangrous中TimedJSONWebSignatureSerializer在2.0版本被弃用后寻找新的替代方案

在《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 Like

好的 谢谢。我看了下PyJWT的文档决定就使用它了,发现itsdangerous也是在PyJWT上进行了封装,尽管使用PyJWT要比直接使用TimedJSONWebSignatureSerializer麻烦一些,但这也是一个不错的解决方案

如果用 Authlib 的话可以参考这个示例:

好的,谢谢辉哥

1 Like

这不是 andyzhou 的好事? :rofl:

欸嘿,这不是我写的嘛 :smiley:

1 Like

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 Likes