首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用后强制令牌过期(在python中使用其危险库为令牌设置过期时间之前)

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

Stack Overflow用户
提问于 2019-05-16 21:31:48
回答 2查看 1K关注 0票数 3

我的使用案例是为reset password api生成token。这是我用python编写的危险的库。https://pythonhosted.org/itsdangerous/

此令牌(在重置密码链接内)通过电子邮件转发到客户端,令牌有过期时间限制,验证后密码重置可成功通过。

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

有没有更好的方法来强制令牌过期?如果不是,保存令牌状态的最佳方式是什么?

代码语言:javascript
复制
import itsdangerous

key = "test"

# signer = itsdangerous.URLSafeTimedSerializer(key)
signer = itsdangerous.TimedJSONWebSignatureSerializer(key, expires_in=5)
email = "email@test.com"

# token = email  # to be used with URLSafeTimedSerializer
token = signer.dumps({"email": email})

print token

# print signer.loads(token, max_age=5) # to be used with URLSafeTimedSerializer
print str(signer.loads(token)["email"]) # to be used with TimedJSONWebSignatureSerializer
EN

回答 2

Stack Overflow用户

发布于 2019-05-16 21:59:18

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

但是,您可以做的一件事是在生成令牌并将密钥存储在数据库中后,生成一个惟一的密钥("some_key")。最后,将颁发给用户的令牌有效负载可能如下所示:{"email": email, "reset_key": "some_key"}

每次有人尝试重置其密码时,您只需先验证该密钥,以便允许或拒绝请求。

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

我希望这对你有帮助!

票数 1
EN

Stack Overflow用户

发布于 2020-08-03 05:18:01

我意识到这是一个迟来的答案,所以为了其他人找到这个问题而补充。

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

例如,在Flask中使用session对象:

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56169829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档