我正在使用带有 itsdangerous 的 Flask 来实现基于 token 的登录。它工作正常,但是当用户使用 logout_user()
调用注销时, token 仍然有效,导致不一致。所以我也试图让 token 过期但找不到合适的方法。这是我想出的:
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'])
但我不喜欢这个解决方案。有人可以建议更好的方法吗?
最佳答案
最终,基于 token 的身份验证不允许简单的特定失效。 (通用失效很容易 - 只需更改用于签署 session 的 SECRET_KEY
- 每个 session 都会自动失效)。有几种方法可以使特定的失效生效:
- 在用户的个人资料中存储一个随机数,并在他们每次注销时重置它。任何不包含最新随机数的 token 将立即被视为无效。
- 存储一组已撤销的 token (一旦它们过期就将其删除以防止该组无限增长)并根据该组检查每个 token 。当用户注销并且他们的 token 上仍有时间时,将用户的 token 添加到集合中。
- 发行短期 token 并提供简单的续订流程(在 API 级别或在您的应用程序中),这样 5 分钟的 token 就不会影响用户体验。
关于python - Flask:注销时 token 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736092/