Защита сервиса с помощью OAuth2, токен JWT не работает Spring cloud - PullRequest
1 голос
/ 15 апреля 2020

У меня есть микросервисная архитектура. И я защищаю службу с помощью OAuth2 и настроен на использование токена JWT. У меня проблема с обеспечением услуг в этом микросервисе. Я успешно внедрил сервер авторизации. Я могу сгенерировать токен JWT и получить доступ к защищенному ресурсу сервера авторизации.

Для защиты микроуслуг я сделал следующие вещи:

  1. Добавлена ​​зависимость в pom-файле микро-сервис, который я хочу защитить с помощью OAuth2:
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
Изменено приложение boostrap, как показано ниже:
@SpringBootApplication
@EnableResourceServer
public class Application {

            ...
}
Создал JwtTokenConfiguration, как показано ниже:
    private String getPublicKeyAsString() {

        try {
            Resource resource = new ClassPathResource("publickey.pem");
//          return IOUtils.toString(oAuth2ConfigProperties.getJwt().getPublicKey().getInputStream(),
//                  StandardCharsets.UTF_8);
            String strPublicKey= ".....";
            String verifierKey = String.format("-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----", strPublicKey);
                  //verifierKey = String.format("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----", strPublicKey);

            System.out.println(verifierKey);
            return verifierKey;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setVerifierKey(getPublicKeyAsString());
        return jwtAccessTokenConverter;
    }

Ошибка выглядит следующим образом:

    ... 33 common frames omitted
Caused by: java.lang.IllegalStateException: For MAC signing you do not need to specify the verifier key separately, and if you do it must match the signing key
    at org.springframework.util.Assert.state(Assert.java:73) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter.afterPropertiesSet(JwtAccessTokenConverter.java:318) ~[spring-security-oauth2-2.3.4.RELEASE.jar:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 53 common frames omitted

Файл oauthcer.jks находится на сервере авторизации. Я сгенерировал publi c из oauthcer.jks, выполнив следующую команду:

keytool -list -rfc --keystore oauth2cer.jks

Результат, полученный при запуске команды, выглядит следующим образом:

-----BEGIN CERTIFICATE-----
MIIDfDCCAmSgAwIBAgIJAM8UC/xKlIfwMA0GCSqG ...
-----END CERTIFICATE-----

I проверил результат в URL: https://8gwifi.org/PemParserFunctions.jsp и он отлично работает.

Я не знаю, почему он не работает. Я перепробовал много вещей. Я укажу любое руководство.

1 Ответ

1 голос
/ 15 апреля 2020

Я столкнулся с подобной проблемой. То, что вы делаете неправильно, вы передаете сертификат на: jwtAccessTokenConverter.setVerifierKey(getPublicKeyAsString());. Вам нужно передать ключ publi c.

Чтобы решить эту проблему, вам нужно извлечь ключ publi c из oauth2cer.jks. Выполните приведенную ниже команду для извлечения ключа publi c:

keytool -list -rfc --keystore oauth2cer.jks | openssl x509 -inform pem -pubkey -noout

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

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAdfsdfsdaxzcCAQ8AMIIBCgKCAQEAvJXQdLvlF1d
hx+AAzmNpuD89XPFAcmrvCt7CTGzi0bd/3WzK8dP2clxnVFANh7mbu24U91jK9ZS
3rewr4534tgfdryt54ytry6uyr
-----END PUBLIC KEY-----

Приведенный выше результат должен быть передается в метод setVerifierKey.

...