【发布时间】:2019-12-03 23:05:24
【问题描述】:
在我的Flask 应用程序中刷新过期的JWT 令牌后,我无法弄清楚如何继续请求流程。
我将access token 和refresh token 存储在各自的cookie 中。
这就是我的流程现在的样子:
下面是我的装饰器函数,用于检查JWT 令牌的有效性
def check_valid_jwt(f):
@wraps(f)
def wrapper():
print(request.cookies)
if 'access_token_cookie' in request.cookies:
print('Verify Signature')
# some code that verifies the JWT signature
print('Signature verification successful')
# some code that extracts claims from the token
if time.time() > claims['exp']:
print('Token is expired')
# some code that get the new access token using refresh token
# What am I supposed to do here after I get the refresh token and continue the request while adding the new token to access_token cookie?
return f()
return wrapper
这是我的受保护端点的样子:
@check_valid_jwt
def secretpage():
return render_template("/home/secret_page.html")
获得刷新令牌后,我想继续请求流程并在 cookie 中添加新的 access token,但如果我在 check_valid_jwt 装饰器函数中添加它,secretpage 处理程序将不知道新的access token 已发布。
如何做到这一点,如果新的access token 已发布,它会被添加到响应中。我在这里完成了吗?这不是Authentication flow 的工作方式吗?
【问题讨论】:
-
对我来说,如果令牌过期,请求应该结束,刷新令牌并重试是您客户的工作。但我不确定这是否适用于您的用例。
-
我想在我的
refresh token也过期的最坏情况下这样做,将401发回。如果我的refresh token有效,我想让最终用户变得简单。 -
如果您在每个请求中都发送访问和刷新 cookie,那么拥有单独的刷新令牌确实没有意义。拥有更长寿命的访问令牌在功能上是相同的,没有您在此处处理的刷新流程复杂性。
-
@vimalloc 我每次请求都发送刷新令牌的原因是因为我有 30 分钟的会话要求。由于没有会话,如果访问令牌未过期,我必须在接下来的 30 分钟内更新访问令牌。为此,我需要刷新令牌。
-
听起来您希望您的用户在闲置 30 分钟后退出,对吗?而不是在令牌过期后刷新令牌,也许您应该预先主动刷新令牌。例如,如果旧令牌在到期后 15 分钟内,您可以创建并设置新令牌。