如何确保 JWT 不会在用户身上过期

How can I make sure a JWT doesn't expire on the user

所以我可以使用 flask-jwt-extended 在登录时创建 aa JWT

我将到期时间设置为 5 分钟。 所以我在我的 VueJS 应用程序中有路由,当它们被调用时(beforeeach)我调用“/api/check”以确保令牌有效。

所有其他 API 调用都是通过 axios 到后端。

我不明白的是,由于 cookie 仅是 HTTP,我无法使用 javascript 检查 expiation...这是否意味着我必须每 X 分钟 ping 一次后端以及每axios 调用刷新 cookie 然后进行实际的 API 调用?

似乎开销很大。 关于具体细节的代码很多,但我遇到的问题背后的实际步骤并不多……理解……

谢谢

分解 jwt 和 returns 过期时间的后端服务可以解决问题。

您可以让后端在 cookie 即将过期时自动刷新 cookie,而无需在前端执行任何额外操作。像这样(未经测试)

@app.after_request
def refresh_jwt_if_near_expiring(response):
    expires_time = get_raw_jwt().get('exp')
    if not expires_time:
        return response
    
    # Change the time delta based on your app and exp config. 
    target_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=5)
    if (target_time > expires_time):
        access_token = create_access_token(identity=get_jwt_identity())
        set_access_cookies(response, access_token)

    return response

然后,如果用户在 X 分钟内处于非活动状态,他们将被注销,否则他们会根据需要不断获得新令牌。如果他们确实等待太久而退出,后端 returns 401 和您的前端可以提示他们再次登录。

在我看来,您不需要路由“/api/check”来确保令牌有效。只需添加一个装饰器 @jwt_required

@api.route('/api/user')
@jwt_required
def api_user():
    result = #your logic
    return jsonify(result), 200