X-WSSE заголовки и Java

Всем привет! Сегодня поговорим об http-запросах с X-WSSE авторизацией. Около года назад партнер, с которым мы интегрировали нашу платформу сообщил, что для отправки пушей (POST-запросов) в его сторону необходимо чтобы в запросах фигурировал заголовок X-WSSE. На тот период я совершенно не работал с данным типом авторизации и не знал каким образом в Java подкладывать в запрос заголовок подобного типа. Сегодня я покажу как это сделать на примере простого restTemplate (старого http-клиента, на котором выросло ни одно поколение java-программистов).

Что такое X-WSSE, если совсем вкратце? Это обычный заголовок запроса, строка сгенерированная в определенном формате. Как правило, формат такой:

UsernameToken Username="bank002", PasswordDigest="NjEwODIwYThjZjRiY2M5NDYwMDljNDYzYWE4MWQ5MGEwNWJjNTU4OA==", Nonce="42d721904db0a12c955c8f4d3a6223bd", Created="2020-04-07T08:26:07+0000"

Что здесь важно:

  • Created обязательно в формате ISO 8601. Важно не напутать с зонами при передачи данных. Так же важный момент: часто принимающий сервер ограничивает timeframe определенным диапазоном. Соответственно, если вы сгенерировали заголовок час назад, он может просто не пройти по «таймфрейму».
  • digest — sha1 бинарный хэш. Но бывает, что принимающая сторона ждет от вас и sha256.
  • nonce — случайный набор символов (криптографически случайная строка).
  • username и password как правило выдает партнер, к которому вы «стучитесь».

Ну что же, давайте реализуем это на Java.

Для простоты сделаем все в одном классе с различными сервисными методами. Начнем с переменных, которые будем использовать:

Как правило эти переменные задаются не так, а прописываются в т.н. конфигах (application.properties), а еще лучше в профилированных конфигах (что-то типа application-prod.properties или yml-файлах), либо вообще в манифестах (если мы деплоимся в облако, например).

Пишем сам метод преобразования:

Теперь нам нужен сервисный метод, который как раз возвращает digest. В формировании хэша используются nonce и timestamp, поэтому он всегда будет уникальным:

Идем дальше. Теперь нам нужно сформировать nonce и timestamp:

Все почти готово. Осталось вставить сам заголовок и «дернуть» запрос. Это могло бы выглядеть так:

Видео-версия статьи:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *