注销时使flask-JWT无效

时间:2017-06-08 10:02:11

标签: python jwt flask-jwt

我已经为用户身份验证生成了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})

4 个答案:

答案 0 :(得分:3)

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

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

  

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

答案 1 :(得分:2)

由于已经回答,黑名单是使JWT令牌无效的基本方法之一。但是,应该注意的是,除非您因某些原因需要保留所有令牌,否则列入黑名单的令牌应保留在DB或其他任何地方,直到它们到期为止。

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

答案 2 :(得分:2)

检查flask-jwt-extended。它支持在扩展中内置黑名单令牌(并且仍然得到积极支持,不像已经放弃的烧瓶jwt)。

http://flask-jwt-extended.readthedocs.io/en/latest/blacklist_and_token_revoking.html

答案 3 :(得分:0)

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

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

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

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