注销时使 flask-JWT 无效

On logout invalidate 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})

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

注意:在有效负载本身中放置任何约束不是一个好主意,如果您不想使用黑名单方法,请使用其他令牌生成方案,例如 Hawk,其中生成的令牌保存在 DB/other 存储中解决方案 & 在 invalidate/logout 上已删除。

if you want to log out a user from all devices
1. keep a user-specific secret key in DB and use the secret key to create JWT token
2. Assign a new secret key for the user, which will in effect invalidate all JWT tokens send to user/clients.
3. This can be useful when the user changed his/her password

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

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

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

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

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

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

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

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