10

设想

登录用户的令牌有效期为 24 小时。在此期间,所有带有@jwt_required装饰器的请求都将使当前访问令牌的有效期再延长 24 小时。最长有效期为 168(24 * 7) 小时。

可以使用 access_token 和 refresh_token。

ret = {
        'access_token': create_access_token(identity=username, fresh=True),
        'refresh_token': create_refresh_token(identity=username)
    }

但这意味着来自我的应用程序的每个 API 调用都将是两个请求: 1. 实际 HTTP 请求 2. 刷新身份验证令牌

@app.route('/refresh', methods=['POST'])
@jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    ret = {
        'access_token': create_access_token(identity=current_user)
    }
    return jsonify(ret), 200

有没有办法隐式扩展身份验证令牌?

4

2 回答 2

31

编辑:这里现在有文档:https ://flask-jwt-extended.readthedocs.io/en/latest/refreshing_tokens/

flask-jwt-extended 的作者在这里。从技术上讲,您实际上无法扩展令牌,您只能将其替换为具有新过期时间的新 JWT。不过,有几种方法可以模拟这一点。

首先,您可以让服务器本身在每次请求时隐式发回一个新令牌,而不是让客户端请求一个新令牌。您可以在标头中而不是在 JSON 有效负载中将新的 JWT 发送回,这样您就不必修改 JSON 数据来考虑新 JWT 的可能性。不过,您的客户需要注意这一点,他们需要检查每个请求的新标头,如果存在的话,用新的 JWT 替换他们当前的 JWT。您可能可以使用烧瓶 after_request 方法来执行此操作,因此您不必将该功能添加到所有端点。将 JWT 存储在 cookie 中时可以实现类似的效果,不同之处在于 cookie 会自动存储在您的浏览器中(因此您的客户端不会http://flask-jwt-extended.readthedocs.io/en/latest/tokens_in_cookies.html)。

以上应该可以正常工作,但是您将创建许多在创建后立即丢弃的访问令牌,这可能并不理想。上面的一个变体是检查令牌是否即将过期(也许它是否已经过期一半以上)并且只有在这种情况下才创建并返回一个新的令牌。另一个变体是让客户端检查令牌是否即将过期(通过 javascript),如果是,则使用刷新令牌来请求新的访问令牌。为此,您需要在点 ('.') 上拆分 JWT,base64 解码来自该拆分的第二组字符串(索引 1),并从那里获取 'exp' 数据。

第二种方法实际上是等待令牌过期,然后使用刷新令牌生成新的访问令牌并重新发出请求(反应式而不是主动式)。这可能看起来像发出请求,检查 http 代码是否为 401,如果是,则使用刷新令牌生成新的访问令牌,然后再次发出请求。

希望这可以帮助 :)

于 2017-09-18T16:59:53.293 回答
1
app = Flask(__name__)

app.config["JWT_SECRET_KEY"] = "super-secret"  # Change this!
app.config["JWT_ACCESS_TOKEN_EXPIRES"] = timedelta(hours=1)
app.config["JWT_REFRESH_TOKEN_EXPIRES"] = timedelta(days=30)
jwt = JWTManager(app)

根据您的要求更改时间

于 2021-10-01T07:01:40.870 回答