Flask JWT在每个请求上扩展令牌的有效性

时间:2017-09-13 12:02:46

标签: python flask flask-jwt-extended

方案

登录用户的令牌有效期为24小时。在此期间内,使用class CustomRenderer(InlineLexer): # Modify this array as you like # you can insert or delete whatever rules it has self.default_rules.insert(3, 'some_function') 装饰器的所有请求都会将当前访问令牌的到期时间延长24小时。最长有效期为168(24 * 7)小时。

可以使用access_token和refresh_token。

@jwt_required

但这意味着来自我的applicatino的每个API调用都将是两个请求: 1.实际HTTP请求 2.刷新身份验证令牌

ret = {
        'access_token': create_access_token(identity=username, fresh=True),
        'refresh_token': create_refresh_token(identity=username)
    }

有没有办法隐式扩展身份验证令牌?

1 个答案:

答案 0 :(得分:15)

flask-jwt-extended的作者在这里。从技术上讲,您实际上无法扩展令牌,您只能将其替换为具有新过期时间的新JWT。有几种方法可以模拟这个。

首先,您可以让服务器本身隐式地在每个请求上发回一个新令牌,而不是让客户端请求新令牌。您可以将新JWT发送回标头而不是JSON有效负载,这样您就不必修改JSON数据以考虑新JWT的可能性。您的客户需要知道这一点,他们需要在每个请求上检查新的标头,并将其当前的JWT替换为新的JWT(如果存在)。您可以使用烧瓶after_request方法来执行此操作,因此您无需将该功能添加到所有端点。将JWT存储在cookie中时可以获得类似的效果,区别在于cookie会自动存储在您的浏览器中(因此您的客户端不必在每次请求时手动查找它们),并且增加了复杂性如果你走这条路线(http://flask-jwt-extended.readthedocs.io/en/latest/tokens_in_cookies.html),那就是CSRF保护。

上面应该可以正常工作,但是你会创建很多在创建后立即丢弃的访问令牌,这可能并不理想。上述的一种变体是检查令牌是否即将到期(可能是否超过了到期的一半)并且如果是这种情况,则仅创建并返回新令牌。另一种变体是让客户端检查令牌是否即将到期(通过javascript),如果是,则使用刷新令牌请求新的访问令牌。要做到这一点,你需要在点上分割JWT('。'),base64解码该分割中的第二组字符串(索引1),然后抓住' exp&#39 ;来自那里的数据。

您可以执行此操作的第二种方法实际上是等待令牌过期,然后使用刷新令牌生成新的访问令牌并重新生成请求(反应而非主动)。这可能看起来像是在发出请求,检查http代码是否为401,如果是,请使用刷新令牌生成新的访问令牌,然后再次发出请求。

希望这会有所帮助:)