【问题标题】:On logout invalidate flask-JWT注销时使烧瓶-JWT 无效
【发布时间】:2017-11-09 23:39:50
【问题描述】:

我为用户身份验证生成了 Flask-JWT 令牌,但在注销时我想使令牌无效。现在它允许在注销后访问路由。

@app.route('/logout', methods=['POST'])
@jwt_required
def logout():
    user = current_user
    user.authenticated = False
    db.session.commit()
    logout_user()
    return jsonify({'success': True})

【问题讨论】:

    标签: python jwt flask-jwt


    【解决方案1】:

    JWT 令牌系统的工作方式是将用户身份(或相关)数据和令牌到期参数放入生成的令牌本身,该令牌使用非共享(秘密)密钥进行签名。如果您想使令牌无效您需要将表中的令牌列入黑名单并检查视图/路由或从客户端删除令牌,以便客​​户端需要再次重新生成令牌。

    注意:在负载本身中设置任何约束都不是一个好主意,如果您不想要黑名单方法,请使用其他令牌生成方案,例如 Hawk,其中生成的令牌保存在 DB/其他存储解决方案中并失效/logout 它被删除。

    如果您想从所有设备上注销用户
    1. 在 DB 中保留 user-specific secret 密钥并使用 secret 密钥创建 JWT 令牌
    2. 为用户分配a new secret key,这实际上会使发送给用户/客户端的所有 JWT 令牌无效。
    3. 这在用户更改密码时很有用

    【讨论】:

      【解决方案2】:

      正如已经回答的那样,黑名单是使 JWT 令牌无效的基本方法之一。但是,应该注意的是,除非您出于某种原因需要保留所有令牌,否则应将列入黑名单的令牌保存在 DB 或其他任何地方直到其到期日。

      此外,让 JWT 令牌的有效期尽可能短也很重要,这样在大多数情况下,flask-jwt 本身就会使它们迅速失效。例如,为令牌设置到期时间可能是有意义的 - 30 分钟,例如某些网站的会话超时(绝对不是几天和几个月等)。

      【讨论】:

      • 如果我在注销路由中生成新令牌怎么办?
      • @MayurPatil 让旧令牌失效?
      • @MayurPatil 从理论上讲,客户可以保留旧令牌,他或她可以手动放入请求中并毫无问题地使用。所以最好将它们列入黑名单并尽可能缩短到期时间。
      • 所以在令牌过期后客户端/用户必须重新登录?
      • @MayurPatil 是的,因为如果您在代码中正确实现它,它将不再有效。
      【解决方案3】:

      检查 flask-jwt-extended。它支持内置于扩展中的黑名单令牌(并且仍然受到积极支持,这与已被放弃的烧瓶 jwt 不同)。

      https://flask-jwt-extended.readthedocs.io/en/stable/blacklist_and_token_revoking/

      【讨论】:

      • 我使用 flask_jwt_extended 进行我的 jwt 验证管理,我想在注销后重定向到 url 登录。你有什么想法吗?
      • @app.route('/logout') def logout(): signInform = LoginForm() resp = jsonify({'logout': True}) resp = make_response(render_template('login.html', title = 'Login', form =signInform)) unset_jwt_cookies(resp) #redirect(url_for('login')) return resp, 200
      【解决方案4】:

      一种选择是在生成令牌时将jwt_token 存储在User 模型中。

      class User(db.Model):
          ...
          ...
          jwt_token = db.Column(db.String(128), nullable=True)
      

      在验证传入请求时,将传入令牌与存储的jwt_token 进行比较。它们应该是相同的(与其他验证课程)

      对于注销,只需将jwt_token 字段设置为None。并且它不再与传入的令牌匹配

      【讨论】:

      • 如果用户可以在多个设备上登录,这可能不起作用。登录新设备会更新 db 中的令牌,因此第一台设备上的访问权限将被撤销。
      猜你喜欢
      • 2018-06-17
      • 2014-03-19
      • 1970-01-01
      • 2021-07-30
      • 2019-09-24
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多