我的使用案例是为reset password api生成token。这是我用python编写的危险的库。https://pythonhosted.org/itsdangerous/。
此令牌(在重置密码链接内)通过电子邮件转发到客户端,令牌有过期时间限制,验证后密码重置可成功通过。
这里的问题是,一旦密码重置成功,我如何确保相同的令牌(电子邮件链接)不会在过期时间限制内再次使用。我可以看到它的危险有URLSafeTimedSerializer,这有助于在验证阶段评估令牌有多老。另一方面,TimedJSONWebSignatureSerializer在生成令牌时帮助设置过期时间。请检查附件中的代码。
有没有更好的方法来强制令牌过期?如果不是,保存令牌状态的最佳方式是什么?
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发布于 2019-05-16 21:59:18
生成令牌并对其进行签名后,它将一直有效,直到过期。你不能再改变这一点了。考虑到这一点,这也意味着一旦签名,您就不能更改它的任何有效负载,否则它将被呈现为无效(由于无效的签名)。
但是,您可以做的一件事是在生成令牌并将密钥存储在数据库中后,生成一个惟一的密钥("some_key")。最后,将颁发给用户的令牌有效负载可能如下所示:{"email": email, "reset_key": "some_key"}。
每次有人尝试重置其密码时,您只需先验证该密钥,以便允许或拒绝请求。
一旦重置成功,您只需从数据库中删除该键(或将其标记为无效)。这将使包含相同令牌的以下请求无效,即使令牌本身从到期的角度来看仍然有效。
我希望这对你有帮助!
发布于 2020-08-03 05:18:01
我意识到这是一个迟来的答案,所以为了其他人找到这个问题而补充。
另一种方法可能是使用布尔会话变量,例如tokenused,并在令牌被反序列化后将其设置为True;从而使令牌的使用无效。
例如,在Flask中使用session对象:
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 uidhttps://stackoverflow.com/questions/56169829
复制相似问题