Проверьте целостность сообщения в ответном сообщении API с помощью JWT-расширенного в Flask - PullRequest
1 голос
/ 19 апреля 2019

Предполагая, что у меня есть конечная точка API api.example.com/v1/data и метод GET с @ jwt-required, похожим на этот:

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).

1 Ответ

1 голос
/ 25 апреля 2019

Вы можете использовать Flask's 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) Добавьте контрольную сумму к заголовкам ответа (я бы пошел с этим). E.g.:

@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 так, как вам нужно.

...