我已经为用户身份验证生成了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})
答案 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
。它将不再与传入的令牌匹配