如何确保 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
所以我可以使用 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