使用Flask中的JWT扩展检查消息的完整性到API响应消息

问题描述 投票:1回答:1

假设我有一个API端点api.example.com/v1/data和一个与@ jwt-required相似的GET方法:

from flask_jwt_extended import jwt_required
from flask_restful import Resource

class Data(Resource):
    @jwt_required
    def get(self):
        """
        GET Response message.
        """
        return {"message":"important-info", "ts":datetime}, 200

因此,要获取此消息,您需要使用请求标头中的Bearer“access_token”对自己进行身份验证。

我怎么能为这条消息创建一个HMAC。理想情况下,我想添加访问令牌,以便检查整个消息的完整性。

所以我想在返回的JSON中有一个额外的字段,称为校验和,带有值hash(whole_message)。

python python-3.x security flask flask-restful
1个回答
1
投票

您可以使用Flask的after_request来注册一个函数,该函数在视图生成后处理响应。

例如,要完全按照您的要求(我使用内置的python的hash函数,您可以根据需要导入/编写自己的函数):

@app.after_request
def after_request(response):
    data = json.loads(response.get_data())
    data['checksum'] = hash(response.get_data())
    response.set_data(json.dumps(data))
    return response

但是,您必须确保始终返回字典才能生效。以下是几种选择:

1)在另一个json中包含视图的响应,例如:

@app.after_request
def after_request(response):
    data = json.loads(response.get_data())
    data = {
        'response': data,
        'checksum': hash(response.get_data())
    }
    response.set_data(json.dumps(data))
    return response

2)将校验和添加到响应头(我会使用这个)。例如。:

@app.after_request
def after_request(response):
    response.headers['Checksum'] = hash(response.get_data())
    return response

最后要注意的是,如果您想使用访问令牌对响应进行哈希处理,正如您在问题中所述,您可以从request对象访问此令牌,如下所示:

from flask import request
access_token = request.headers.get('Authorization')

所以现在你可以以任何你需要的方式使用access_token

© www.soinside.com 2019 - 2024. All rights reserved.