【问题标题】:How to delete the URLSafeTimedSerializer token after use in python?在 python 中使用后如何删除 URLSafeTimedSerializer 令牌?
【发布时间】:2020-03-10 04:12:15
【问题描述】:
我使用 python itsdangerous URLSafeTimedSerializer 创建了一个令牌,用于忘记密码功能。令牌在 max-age 之后过期,但是当密码被重置时,我需要使该令牌过期,这样用户就无法使用令牌一次又一次地重置密码,直到它过期。那么,这里的问题是用户重置密码后如何使令牌过期?
【问题讨论】:
标签:
python
token
forgot-password
itsdangerous
【解决方案1】:
尽管有@Uber 的评论,但我理解这个问题。另外我相信这更像是一个设计问题,所以发布代码没有多大意义。这次我将提供一个答案,但请记住正确写下未来的问题,例如提供一个场景,例如您的数据库表,并更好地描述重置密码的活动顺序(请参阅https://stackoverflow.com/help/how-to-ask)。
假设您通过URLSafeTimedSerializer 库生成一个令牌,如下所示:
from itsdanger import URLSafeTimedSerializer
ts = URLSafeTimedSerializer("my-secret-key")
token = ts.dumps(email, salt="my-salt")
为了使此类令牌过期,您有不同的可能性:
- 创建已使用令牌的黑名单(这不是一个好主意,因为它会变得太长,并且在生成令牌时可能会发生冲突)。
- 在您的用户表中添加一个“token_reset”字段,并在其中存储当前有效的令牌。一旦用户使用它,就将其从表中删除。如果用户不存在令牌,则表示他/她已经使用过。
- 为您的令牌添加一个时间戳,这样当您取回它时(您可以使用 itsdanger 库对其进行解密),您就知道它是否已过期(尽管用户可能会在 5 分钟内使用它两次)。
可能有其他方法可以解决此类问题,但解决方案 #2 是最常用的一种(根据我的经验)。如果其他用户有其他建议,请随时编辑此答案。