Как на сервере хранить токен стороннего сервиса?

Рейтинг: 0Ответов: 2Опубликовано: 22.01.2023

Коллеги, подскажите, как в бэкенде хранить токен? У меня spring boot приложение пользуется сервисом с курсами валют, от которого был получен токен. Какие стандартные практики хранения здесь, если требуется безопасность?

Ответы

▲ 1

рекомендую хранить токен в безопасном месте на стороне сервера, используя шифрование и хранение его в базе данных. Это позволяет вам контролировать доступ к токену и защитить его от несанкционированного доступа.

import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;
import org.springframework.security.crypto.keygen.KeyGenerators;

// создание соли
String salt = KeyGenerators.string().generateKey();
// шифрование токена
TextEncryptor encryptor = Encryptors.text("password", salt);
String tokenEncrypted = encryptor.encrypt(token);

// сохранение токена в базе данных
tokenRepository.save(new Token(tokenEncrypted, salt));

// при извлечении токена из базы данных
Token tokenFromDb = tokenRepository.findById(id);
String salt = tokenFromDb.getSalt();
// дешифровка токена
TextEncryptor decryptor = Encryptors.text("password", salt);
String tokenDecrypted = decryptor.decrypt(tokenFromDb.getTokenEncrypted());
▲ 0

У вас под капотом спринг. Посему создайте простой интерфейс, имеющий методы:

public String authorize();
public String getToken();

Для каждого внешнего ресурса, который требует авторизации, вы пишите отдельный сервис, который имплементирует данный интерфейс. Переопределяя данный методы, вы пишите логику авторизации на данном ресурсе (получение токена) для метода public String authorize(). В данном сервисе заводите потокобезопасную переменную , к примеру, таким образом:

AtomicReference<String> token = new AtomicReference<String>();

Теперь переопределяете метод String getToken(), возвращая токен, спрятанный в AtomicReference. кроме того, для предыдущего метода String authorize() перед возвращением полученного при авторизации токена, вы пишите его сюда (в AtomicReference).

Здесь Можно создавать пару для токена и рефреш токена, можно коллекцию, в т.ч. на уровне супер класса (все зависит от вашей задачи)

Данный сервис добавляете на уровень отправки запроса (это может быть отдельный бин ресттемплейта, дополнительно сконфигурированный на добавление хедера авторизации, или что-либо другое), где отлавливаете исключения авторизации , связанные с истечением срока службы токена. Теперь при отправке каждого запроса (на уровне конфигурации ресттемплейта) вы дергаете метод getToken(), а при исключении авторизации - метод authorize() и повторяете запрос с новым токеном.

Все, теперь все запросы будут авторизироваться автоматически, подставляя и обновляя нужный токен