我正在使用烧瓶和刷新/访问令牌构建应用程序。如果访问令牌即将过期,我将负责刷新访问令牌。
有此代码可以自动刷新身份验证令牌:
@app.after_request
def refresh_expiring_jwts(response):
try:
exp_timestamp = get_jwt()["exp"]
now = datetime.now(timezone.utc)
target_timestamp = datetime.timestamp(now + timedelta(minutes=30))
if target_timestamp > exp_timestamp:
access_token = create_access_token(identity=get_jwt_identity())
set_access_cookies(response, access_token)
return response
except (RuntimeError, KeyError):
# Case where there is not a valid JWT. Just return the original respone
return response
这里的问题是没有使用刷新令牌(但根据我对文档的理解,这是刷新令牌的目标)。
所以我尝试添加这个函数的装饰器:
@jwt_refresh_token_required
那么只有在 cookie 中有刷新令牌时,我们才能刷新我们的访问令牌。
问题是我在登录前有一个问题:当你第一次访问网站时,你需要登录,所以你没有刷新令牌,并且因为上面的代码是完成@app.after_request,所以它会失败,因为用户在 cookie 中仍然没有刷新令牌。要知道将上面的脚本与我的新装饰器一起保存,我的代码中有这个错误:
flask_jwt_extended.exceptions.NoAuthorizationError: Missing cookie "refresh_token_cookie"
和网站返回内部错误
所以我想要的不是在每个请求之后都执行这个脚本,而只是在请求访问一个秘密之后(带有@jwt_required的函数)
也许这不是正确的方法,所以如果你有更好的解决方案,我会接受。
谢谢