0

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

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

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

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

似乎开销很大。有很多关于螺母和螺栓的代码,但在我遇到的问题背后的实际步骤上却没有太多......理解......

谢谢

4

3 回答 3

1

如果 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 分钟内处于非活动状态,他们将被注销,否则他们会根据需要继续获取新令牌。如果他们确实等待太久并退出,后端会返回 401,您的前端可以提示他们再次登录。

于 2020-07-17T04:29:23.117 回答
0

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

@api.route('/api/user')
@jwt_required
def api_user():
    result = #your logic
    return jsonify(result), 200
于 2020-07-17T06:35:41.813 回答
0

分解 jwt 并返回过期时间的后端服务可以解决问题。

于 2020-07-17T00:15:12.297 回答