在 Flask 中使用 JWT-extended 检查 API 响应消息的消息完整性
Check the Integrity of Message to an API Response message using JWT-extended in Flask
假设我有一个 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
因此,要获取此消息,您需要在请求的 header.
中使用 Bearer "access_token" 对自己进行身份验证
我如何为这条消息创建一个 HMAC。理想情况下,我想添加访问令牌,以便检查整个消息的完整性。
所以我想在返回的 JSON 中有一个名为校验和的额外字段,其值为散列 (whole_message)。
您可以使用 Flask 的 after_request
注册一个函数来处理视图生成的响应。
例如,完全按照你的要求去做(我用的是built-inpython的hash
函数,你可以根据需要import/write自己的) :
@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
但是,您必须确保总是 return 字典才能正常工作。这里有几个备选方案:
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) 将校验和添加到响应 headers(我会选择这个)。例如:
@app.after_request
def after_request(response):
response.headers['Checksum'] = hash(response.get_data())
return response
最后一点,如果您想使用访问令牌对响应进行哈希处理,正如您在问题中所述,您可以从 request
object 访问此令牌,如下所示:
from flask import request
access_token = request.headers.get('Authorization')
所以现在您可以根据需要以任何方式使用 access_token
。
假设我有一个 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
因此,要获取此消息,您需要在请求的 header.
中使用 Bearer "access_token" 对自己进行身份验证我如何为这条消息创建一个 HMAC。理想情况下,我想添加访问令牌,以便检查整个消息的完整性。
所以我想在返回的 JSON 中有一个名为校验和的额外字段,其值为散列 (whole_message)。
您可以使用 Flask 的 after_request
注册一个函数来处理视图生成的响应。
例如,完全按照你的要求去做(我用的是built-inpython的hash
函数,你可以根据需要import/write自己的) :
@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
但是,您必须确保总是 return 字典才能正常工作。这里有几个备选方案:
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) 将校验和添加到响应 headers(我会选择这个)。例如:
@app.after_request
def after_request(response):
response.headers['Checksum'] = hash(response.get_data())
return response
最后一点,如果您想使用访问令牌对响应进行哈希处理,正如您在问题中所述,您可以从 request
object 访问此令牌,如下所示:
from flask import request
access_token = request.headers.get('Authorization')
所以现在您可以根据需要以任何方式使用 access_token
。