8

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

4 回答 4

6

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

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

于 2017-06-08T14:12:16.497 回答
3

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

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

于 2017-06-08T10:28:54.483 回答
3

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

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

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

于 2017-06-08T10:12:48.340 回答
0

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

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

并在验证传入请求时,将传入的 token 与 stored 进行比较jwt_token。他们应该是相同的(与其他验证offcourse)

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

于 2021-05-13T18:23:58.753 回答