#python #python-3.x #security #flask #flask-restful
#python #python-3.x #Безопасность #фляжка #фляжка-успокаивающая
Вопрос:
Предполагая, что у меня есть конечная точка API api.example.com/v1/data и метод GET с @jwt-требуется, аналогичный этому:
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
Итак, чтобы ПОЛУЧИТЬ это сообщение, вам необходимо пройти аутентификацию с помощью носителя «access_token» в заголовке запроса.
Как я мог бы создать HMAC для этого сообщения? В идеале я хотел бы добавить токен доступа, чтобы проверить целостность всего сообщения.
Поэтому я хотел бы иметь дополнительное поле в возвращаемом JSON, называемое контрольной суммой, с хэшем значения (whole_message).
Комментарии:
1. Реально вы, вероятно, должны просто использовать https для этого. Это будет более безопасным / проверенным, чем все, что вы придумаете самостоятельно, и благодаря tcp вы можете быть уверены, что ваше сообщение не будет повреждено по проводам.
2. @vimalloc Да, запрос / ответы будут выполняться по протоколу https. Тем не менее, я хотел бы реализовать эту функцию для тестирования / развлечения, а также интереса.
3. Это может стоить попробовать для обратного проектирования / разветвления. Интересной частью для вас может быть интерфейс отладки для взлома. github.com/dusktreader/flask-praetorian . Признавая, что это не ответ, а скорее просто связанный с sth.
Ответ №1:
Вы можете использовать Flask after_request
для регистрации функции, которая обрабатывает ответ после того, как он был сгенерирован представлением.
Например, чтобы сделать именно то, что вы просите (я использую встроенную hash
функцию python, вы можете импортировать / написать свою собственную по мере необходимости):
@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
его любым удобным вам способом.