Flask:在注销时过期令牌

时间:2015-11-16 13:04:07

标签: python authentication flask

我正在使用带有危险的Flask来实现基于令牌的登录。它工作正常但是当用户使用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'])

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

1 个答案:

答案 0 :(得分:7)

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

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