проверка jwt в серверной springboot

#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.

Общая архитектура в конечном итоге будет выглядеть примерно так: введите описание изображения здесь