Skip to main content
 首页 » 编程设计

python之Flask:注销时 token 过期

2025年05月04日14telwanggs

我正在使用带有 itsdangerous 的 Flask 来实现基于 token 的登录。它工作正常,但是当用户使用 logout_user() 调用注销时, token 仍然有效,导致不一致。所以我也试图让 token 过期但找不到合适的方法。这是我想出的:

def generate_auth_token(self, expiration): 
    s = Serializer(current_app.config['SECRET_KEY'], 
        expires_in=expiration) 
    return s.dumps({'id': self.id}).decode('ascii') 
 
@staticmethod 
def verify_auth_token(token): 
    import flask_login 
 
    u = flask_login._get_user() 
    if not u or isinstance(u, flask_login.AnonymousUserMixin): 
        return None 
 
    s = Serializer(current_app.config['SECRET_KEY']) 
    try: 
        data = s.loads(token) 
    except: 
        return None 
    return User.query.get(data['id']) 

但我不喜欢这个解决方案。有人可以建议更好的方法吗?

请您参考如下方法:

最终,基于 token 的身份验证不允许简单的特定失效。 (通用失效很容易 - 只需更改用于签署 session 的 SECRET_KEY - 每个 session 都会自动失效)。有几种方法可以使特定的失效生效:

  1. 在用户的个人资料中存储一个随机数,并在他们每次注销时重置它。任何不包含最新随机数的 token 将立即被视为无效。
  2. 存储一组已撤销的 token (一旦它们过期就将其删除以防止该组无限增长)并根据该组检查每个 token 。当用户注销并且他们的 token 上仍有时间时,将用户的 token 添加到集合中。
  3. 发行短期 token 并提供简单的续订流程(在 API 级别或在您的应用程序中),这样 5 分钟的 token 就不会影响用户体验。