【问题标题】:Continue request flow after new access token is issued using refresh token使用刷新令牌发出新的访问令牌后继续请求流程
【发布时间】:2019-12-03 23:05:24
【问题描述】:

在我的Flask 应用程序中刷新过期的JWT 令牌后,我无法弄清楚如何继续请求流程。

我将access tokenrefresh 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 分钟内,您可以创建并设置新令牌。

标签: python flask jwt


【解决方案1】:

最好的方法是创建一个用于 JWT 认证的中间件而不是一个装饰器

from flask import Flask


class JWTAuthMiddleware(object):

    def __init__(self, app):
        self.app = app  

    def __call__(self, environ, start_response):
        access_token = environ.get('HTTP_AUTHORIZATION', None)

        # validate access token here and get new one if required by using refresh token

        # you can also update the invalid token in the header here if you want

        environ['HTTP_AUTHORIZATION'] = 'new access token'

        return self.app(environ, start_response)

现在用这个包装实际的 wsgi 应用程序

app = Flask(__name__)

app.wsgi_app = JWTAuthMiddleware(app.wsgi_app)

【讨论】:

  • 所以这只是一个最佳实践答案还是它实际上帮助我解决了我的问题,因为我看不到如何。你能详细说明一下吗?
  • 请为您的应用程序提供一个工作示例。这样我就可以整合我的解决方案来解决这个问题
猜你喜欢
  • 2020-01-09
  • 2020-06-01
  • 2021-08-23
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2019-11-08
  • 2020-07-12
相关资源
最近更新 更多