#spring-boot #jwt
#весенняя загрузка #jwt
Вопрос:
Я хочу создать приложение angular, которое будет входить в систему с помощью нового сервера аутентификации, созданного в springboot, и возвращать jwt.
Идея состоит в том, чтобы создать приложение, способное генерировать и подписывать токен jwt закрытым ключом на основе пользователя / пароля, указанных на экране, сервер аутентификации проверит регистрационную информацию в базе данных и сгенерирует токен jwt.
После этого запрос будет отправлен другому микросервису, и здесь мне нужно иметь возможность проверить токен, но этот микросервис никак не будет подключен к службе аутентификации или базе данных, он просто проверит целостность токена с помощью открытого ключа.
Я ищу повсюду, и я не нахожу подсказки, позволяющей проверить токен, я нашел этот фрагмент кода, но по какой-то причине, когда я запускаю rest API, этот код не выполняется:
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
Resource resource = new ClassPathResource("public.txt");
String publicKey = null;
try {
publicKey = IOUtils.toString(resource.getInputStream(), Charset.defaultCharset());
} catch (final IOException e) {
throw new RuntimeException(e);
}
converter.setVerifierKey(publicKey);
return converter;
}
Имеет ли смысл то, что я пытаюсь сделать?
Спасибо с уважением
Ответ №1:
Ваш сервер аутентификации должен быть единственным отправителем JWT для ваших микросервисов. Итак, когда пользователь входит в систему и успешно проходит аутентификацию, ваш сервер аутентификации выдает JWT, подписанный закрытым ключом (подпись ДОЛЖНА быть асимметричной — RS256 является одним из примеров), который вы храните только на сервере аутентификации; не передавайте этот закрытый ключ другим микросервисам, внутри которых вы хотите проверить JWT. Что вы можете сделать, так это получить открытый ключ на основе закрытого ключа, которым вы подписываете свои токены, и опубликовать его на конечной точке вашего сервера аутентификации, которая не требует аутентификации — открытый ключ будет представлен в виде JWK (см. Ссылку на спецификацию). Google делает нечто подобное здесь. Затем в каждом из ваших микросервисов вам нужно будет разработать способ отправлять GET-запрос к конечной точке с открытым ключом на вашем сервере аутентификации каждые X минут и кэшировать открытый ключ в каждом микросервисе.
Затем всякий раз, когда запрос поступает в один из ваших микросервисов, вы берете JWT, проверяете его действительность и предоставляете доступ / авторизацию, если токен действителен. Прелесть использования пары закрытый / открытый ключи и асимметричной подписи ключа заключается в том, что вы можете проверять токен на основе одного открытого ключа, но не подписывать его. Таким образом, пока каждая служба имеет открытый ключ от вашей конечной точки / cert, они могут проверять токен, даже не обращаясь к серверу аутентификации и не зная закрытого ключа.
Это потребует немного больше предварительной работы, но даст вам огромную простоту, гибкость и спокойствие в будущем, зная, что только один источник знает ваш закрытый ключ.
Я предлагаю использовать эту библиотеку для проверки JWT.
Общая архитектура в конечном итоге будет выглядеть примерно так: