Python Flask:注销时使令牌过期

Python Flask:注销时使令牌过期,python,authentication,flask,Python,Authentication,Flask,我使用Flask实现基于令牌的登录非常危险。它工作正常,但当用户使用logout_user call注销时,令牌仍然有效,导致不一致。所以我试图让令牌也过期,但找不到合适的方法。以下是我的想法: def generate_auth_token(self, expiration): s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration) return s.dumps({'id':

我使用Flask实现基于令牌的登录非常危险。它工作正常,但当用户使用logout_user call注销时,令牌仍然有效,导致不一致。所以我试图让令牌也过期,但找不到合适的方法。以下是我的想法:

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'])

但我不喜欢这个解决方案。有人能推荐一种更好的方法吗?

最终,基于令牌的身份验证不允许轻易失效。通用失效很容易-只需更改用于对会话进行签名的密钥-每个会话都会自动失效。有几种方法可以使特定的失效生效:

在用户的配置文件上存储一个随机的nonce,并在用户每次注销时重置它。任何不包含最新nonce的令牌将立即被视为无效。 存储一组已撤销的令牌。一旦这些令牌过期,请将其删除,以防止该令牌集无限期增长,并根据该令牌集检查每个令牌。当用户注销时,将其令牌添加到集合中,并且其令牌上仍有时间。 发行短期代币,并在API级别或应用程序中提供一个简单的更新流程,这样5分钟的代币不会影响用户体验。
最终,基于令牌的身份验证不允许容易的特定失效。通用失效很容易-只需更改用于对会话进行签名的密钥-每个会话都会自动失效。有几种方法可以使特定的失效生效:

在用户的配置文件上存储一个随机的nonce,并在用户每次注销时重置它。任何不包含最新nonce的令牌将立即被视为无效。 存储一组已撤销的令牌。一旦这些令牌过期,请将其删除,以防止该令牌集无限期增长,并根据该令牌集检查每个令牌。当用户注销时,将其令牌添加到集合中,并且其令牌上仍有时间。 发行短期代币,并在API级别或应用程序中提供一个简单的更新流程,这样5分钟的代币不会影响用户体验。
@Downvoter-请您发表评论以便我改进答案?我有几个问题,首先,我是否应该向用户表添加一列以在数据库中持久化nonce值?第二,我如何知道被撤销的令牌已过期?你能更准确地解释一下第三条路吗?非常感谢。:是的,这是1的要点。对于2,您将使用令牌存储过期时间。至于第3条,不要给用户永久有效的代币-给他们在你能给他们的最短时间内有效的代币,让他们更容易更新代币。@Downvoter-请你评论一下,这样我可以改进答案吗?首先,我有几个问题,我是否应该向用户表中添加一列以在数据库中持久化nonce值?第二,我如何知道被撤销的令牌已过期?你能更准确地解释一下第三条路吗?非常感谢。:是的,这是1的要点。对于2,您将使用令牌存储过期时间。至于第三点,不要给用户永久有效的代币——给他们在你能给他们的最小时间内有效的代币,并让他们更容易更新他们的代币。