Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask JWT根据每个请求扩展令牌的有效性 脚本_Python_Flask_Flask Jwt Extended - Fatal编程技术网

Python Flask JWT根据每个请求扩展令牌的有效性 脚本

Python Flask JWT根据每个请求扩展令牌的有效性 脚本,python,flask,flask-jwt-extended,Python,Flask,Flask Jwt Extended,登录用户的令牌有效期为24小时。在此期间内,所有带有@jwt_requireddecorator的请求将使当前访问令牌的有效期再延长24小时。最长有效期为168(24*7)小时 可以使用access_令牌和refresh_令牌 ret = { 'access_token': create_access_token(identity=username, fresh=True), 'refresh_token': create_refresh_token(identi

登录用户的令牌有效期为24小时。在此期间内,所有带有
@jwt_required
decorator的请求将使当前访问令牌的有效期再延长24小时。最长有效期为168(24*7)小时

可以使用access_令牌和refresh_令牌

ret = {
        'access_token': create_access_token(identity=username, fresh=True),
        'refresh_token': create_refresh_token(identity=username)
    }
但这意味着来自ApplicationNo的每个API调用都将是两个请求: 1.实际HTTP请求 2.刷新身份验证令牌

@app.route('/refresh', methods=['POST'])
@jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    ret = {
        'access_token': create_access_token(identity=current_user)
    }
    return jsonify(ret), 200

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

此处扩展的flask jwt的作者。从技术上讲,您不能实际扩展令牌,您只能用具有新过期时间的新JWT替换它。不过,有几种方法可以模拟这种情况

首先,您可以让服务器本身在每次请求时隐式地发回一个新令牌,而不是让客户端请求一个新令牌。您可以将新的JWT发送回标头中,而不是JSON负载中,这样您就不必修改JSON数据来考虑新JWT的可能性。但是,您的客户机需要意识到这一点,他们需要在每个请求上检查新的头文件,并用新的头文件替换当前的JWT(如果存在)。您可能可以使用flask after_请求方法来实现这一点,因此您不必将该功能添加到所有端点。将JWT存储在Cookie中时也可以实现类似的效果,不同之处在于Cookie会自动存储在浏览器中(这样您的客户端就不必在每次请求时手动查找它们),如果您这样做,CSRF保护的复杂性也会增加()

上面的方法应该可以很好地工作,但是您将创建大量的访问令牌,这些令牌在创建后立即被丢弃,这可能并不理想。上述方法的一个变体是检查令牌是否即将到期(可能是在超过到期一半的情况下),并且仅在这种情况下创建并返回一个新令牌。另一种变体是让客户端检查令牌是否即将过期(通过javascript),如果即将过期,则使用刷新令牌请求新的访问令牌。要做到这一点,您需要在点('.')上拆分JWT,base64解码该拆分中的第二组字符串(索引1),并从中获取“exp”数据

第二种方法是等待令牌过期,然后使用刷新令牌生成新的访问令牌并重新生成请求(被动而非主动)。这可能类似于发出请求,检查http代码是否为401,如果是,则使用刷新令牌生成新的访问令牌,然后再次发出请求


希望这有帮助:)

您好,谢谢您的评论,我正在使用您的库,有一个问题。所以我目前使用的是double submit cookie方法,在这种情况下,JavaScript只能访问csrf_access_令牌和csrf_refresh_令牌,而不是JWT,如何在前端检索JWT并获取过期时间,以便通过检查过期时间在客户端保留用户身份?在前端,您无法访问启用CSRF保护的实际JWT cookie。出于安全原因,这些cookie设置了http only标志。您需要在创建令牌时将该信息发送回,并将其保存在前端,或者创建一个api端点,在后端解码令牌,并将前端可以调用的exp时间戳发送回。感谢您的回复。您认为客户端发出一个额外的请求来获取过期时间比只生成一个新令牌的额外请求要好吗?我只是想说得合理一点,因为如果访问任何受保护的视图都要打额外的电话,由于这两种情况下都必须进行额外调用,所以更好的方法是什么呢?我有点犹豫是否将过期信息作为另一组cookie存储到的本地存储中,因为它可能会受到XSS或CSRF的攻击,因为cookie将仅存储在非http中,以便JS可以检索它。我不会做额外的操作每次调用api时,我只执行一次(例如,在最初生成新令牌时)。本地存储exp时间应该没有任何问题,因为它不包含任何敏感信息。如果有人得到他们的手,他们不能做任何恶意的事情,它只是一个时间戳。