python - Flask:注销时 token 过期

标签 python authentication flask

我正在使用带有 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 都会自动失效)。有几种方法可以使特定的失效生效:

  1. 在用户的个人资料中存储一个随机数,并在他们每次注销时重置它。任何不包含最新随机数的 token 将立即被视为无效。
  2. 存储一组已撤销的 token (一旦它们过期就将其删除以防止该组无限增长)并根据该组检查每个 token 。当用户注销并且他们的 token 上仍有时间时,将用户的 token 添加到集合中。
  3. 发行短期 token 并提供简单的续订流程(在 API 级别或在您的应用程序中),这样 5 分钟的 token 就不会影响用户体验。

关于python - Flask:注销时 token 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736092/

相关文章:

python - 属性错误 : 'NoneType' object has no attribute 'app'

python - 将行附加到空 DataFrame 将 dtype 从 int 转换为 object

authentication - openldap fortress 与 Apache Shiro

ruby-on-rails - 使用 Rails(和设计)验证 Ember 应用程序

authentication - 是否可以像在SocialCam应用程序中一样更改 "okay, watch video"之类的Facebook按钮的文本?

python - 无法通过 flask 将变量传递给html

python - flask send_grid 异步邮件

python - 为什么有些方法使用点符号而其他方法不使用?

python - Pandas 在某些索引点增加整数?

python - 如何在长 Pandas 系列上应用三次样条插值?