Flask:在注销时过期令牌

lan*_*ng2 1 python authentication flask

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

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'])
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这个解决方案.有人可以提出更好的方法吗?

Sea*_*ira 7

最终,基于令牌的身份验证不承认容易特定的失效.(通用失效很容易 - 只需更改SECRET_KEY用于对会话进行签名 - 每个会话都会自动失效).有几种方法可以使特定的失效工作:

  1. 将随机随机数存储在用户的配置文件中,并在每次注销时重置它.任何不包含最新nonce的令牌都被视为立即无效.
  2. 存储一组已撤销的令牌(一旦过期就将其删除以防止该集无限增长)并根据此集检查每个令牌.当用户注销并且其令牌仍然有时间时,将用户的令牌添加到集合中.
  3. 发布短期令牌并提供简单的续订流程(无论是在API级别还是在您的应用程序中),因此拥有5分钟令牌不会影响用户的体验.