如何在使用令牌后强制使其过期(在python中使用其危险库为令牌设置的过期时间之前)

如何在使用令牌后强制使其过期(在python中使用其危险库为令牌设置的过期时间之前),python,password-recovery,itsdangerous,Python,Password Recovery,Itsdangerous,我的用例是为重置密码api生成令牌。我正在用python中的危险库做这件事。 . 此令牌(在重置密码链接内)由转发器通过电子邮件发送给客户端,该令牌具有有效期限制,该期限经过验证,密码重置后可以成功通过 这里的问题是,一旦密码重置成功,我如何确保相同的令牌(电子邮件链接)在到期期限内不能再次使用。我可以看到它有URLSafeTimedSerializer,它在验证阶段帮助评估令牌的使用年限。另一方面,TimedJSONWebSignatureSerializer在生成令牌时帮助设置到期时间。请

我的用例是为重置密码api生成令牌。我正在用python中的危险库做这件事。 .

此令牌(在重置密码链接内)由转发器通过电子邮件发送给客户端,该令牌具有有效期限制,该期限经过验证,密码重置后可以成功通过

这里的问题是,一旦密码重置成功,我如何确保相同的令牌(电子邮件链接)在到期期限内不能再次使用。我可以看到它有URLSafeTimedSerializer,它在验证阶段帮助评估令牌的使用年限。另一方面,TimedJSONWebSignatureSerializer在生成令牌时帮助设置到期时间。请检查所附的代码

是否有更好的方法强制终止令牌?如果不是,保存已使用的令牌状态的最佳方法是什么

导入它
key=“测试”
#签名者=它的危险性。URLSafeTimedSerializer(键)
签名者=它很危险。TimedJSONWebSignatureSerializer(键,expires\u in=5)
电子邮件=”email@test.com"
#令牌=电子邮件#与URLSafeTimedSerializer一起使用
token=signer.dumps({“email”:email})
打印令牌
#打印签名者。加载(令牌,最大年龄=5)#与URLSafeTimedSerializer一起使用
打印str(signer.load(token)[“email”])#与TimedJSONWebSignatureSerializer一起使用

一旦您的令牌生成并签名,它将保持有效,直到过期。你不能再改变了。考虑到这一点,这也意味着一旦对其进行了签名,就不能更改其任何有效负载,否则它将被视为无效(由于签名无效)

但是,您可以做的一件事是在生成令牌并将密钥存储在数据库中后生成唯一密钥(
“some_key”
)。最后,将发给用户的令牌有效载荷可以如下所示:
{“email”:email,“reset\u key”:“some\u key”}

每次有人试图重置密码时,您只需首先验证该密钥即可允许或拒绝请求

重置成功后,您只需从数据库中删除该密钥(或将其标记为无效)。这将使包含相同令牌的以下请求无效,即使令牌本身从到期角度来看仍然有效


我希望这有帮助

我意识到这是一个迟来的答案,因此添加该选项是为了让其他人发现这个问题

另一种方法可能是使用布尔会话变量,例如
tokenused
,并在标记反序列化后将其设置为
True
;从而使令牌的使用无效

例如,在Flask中使用
会话
对象:

    uid = {}
    try:
        if not session['tokenused']:
            session['tokenused'] = True
            s = Serializer(app.config['SECRET_KEY'])
            uid = s.loads(token)
    except Exception as err:
        errors.internal_server_error(err)
    return uid