Я разрабатываю веб-службу с помощью Scalatra и хочу использовать HMAC для двунаправленной аутентификации.
До сих пор я реализовал аутентификацию клиента на сервере: клиент (приложение для Android) вычисляет HMAC/SHA512 для каждого запроса, используя следующие параметры: общий секрет, метод HTTP, URL-адрес, некоторые заголовки (метка времени, clientId и т. д.). ) и тело запроса (если это POST или PUT). Затем этот HMAC добавляется к определенному заголовку, и запрос отправляется на сервер (который проверяет HMAC в заголовке запроса с помощью HMAC, который он вычисляет так же, как и клиент).
Теперь я хочу сделать обратное: заставить сервер аутентифицировать клиента, используя сохраненный общий секрет, HTTP-метод запроса, URL-адрес и ответ body.
До сих пор я обнаружил, что могу переопределить renderResponse(actionResult: Any)
, renderResponseBody(actionResult: Any)
или даже renderPipeline
, и я решил переопределить renderPipeline
, так как с ним проще всего справиться.
В моем переопределении renderPipeline
я преобразовываю тело ответа в массив байтов (загружая обслуживаемый File
в память, если обслуживаю File
), вычисляю HMAC и добавляю его в заголовки response
.
Что я хочу знать, так это: есть ли случаи, когда переопределение renderPipeline
таким образом нарушит либо функциональность аутентификации, представленную выше (например, renderPipeline
не вызывается или вызывается несколько раз, либо заголовки, отправленные до renderPipeline
, вызываются для рендеринга тела) или какая-то другая функциональность в Scalatra?
В качестве примечания я не вычисляю HMAC, когда действие возвращает Unit
, а вывод ответа записывается непосредственно действием.