передать идентификатор клиента oauth2 и секрет клиента из компонента spring boot в файл yaml

#java #spring #spring-boot #oauth-2.0 #yaml

#java #spring #spring-boot #oauth-2.0 #yaml

Вопрос:

Я хочу передать идентификатор клиента oauth2 и секрет клиента из компонента spring boot в yaml вместо прямого жесткого кодирования значений в файле yaml. Мои client-id и client-secret надежно извлекаются из хранилища Harshicorp, и я хочу безопасно передать их в yaml. Как мне это сделать? Я попробовал что-то вроде приведенного ниже

 @Configuration
@ConfigurationProperties(prefix = "spring.security.oauth2.registration.custom-client")
@Slf4j
public class SSOConfig {


    private String client_id;

    private String client_secret;

    public void setClient_secret(String client_secret) {
        this.client_secret = "xxxxxxxxxxxxx";
    }

    public String getClient_secret() {
        return client_secret;
    }

    public void setClient_id(String client_id) {
        this.client_id = "xxxxxxxxxxxx";
    }

    public String getClient_id() {
        return client_id;
    }
 

yaml

 spring:
  thymeleaf:
    cache: false
  security:
    oauth2:
      client:
        registration:
          custom-client:
            client-id: (this line is removed completely)
            client-secret: (this line is removed completely)
            scope: ["openid", "profile", "email", "address", "phone", "groups"]
            provider: custom-provider
            state: xoxoxo
            redirect-uri: http://localhost:8080/login
            client-authentication-method: basic
            authorization-grant-type: authorization_code
 

Я удалил client-id и client-secret из yaml после добавления этого фрагмента кода, но все равно выдает ошибку, например, client-id не может быть пустым

Комментарии:

1. вы не хотите, чтобы конфигурация oauth выбирала свойства из файла, вместо этого вы хотите жестко закодировать код, это то, что вы хотите сделать? Если да, то вы можете переопределить конфигурацию по умолчанию или определить clientbean, который состоит из client_id и secret .

2. да, я не хочу выбирать свойства client-id и client-secret из файла yaml, я хочу, чтобы они были получены из компонента (кода). как это сделать? не могли бы вы указать мне правильное направление?

3. Я опубликую код с репозиторием на github

Ответ №1:

Прошу прощения за позднюю публикацию. Мне пришлось просмотреть документы spring и обнаружил, что с последней версией spring security oauth2 реализация по умолчанию автоматически настраивает все, но в случае, если вы хотите переопределить конфигурацию по умолчанию, в случае, если вы хотите самостоятельно предоставить сведения о клиенте, вы можете переопределить ее, создав @Bean имя ClientRegistrationRepository таким образом,

     @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
    }

    private ClientRegistration googleClientRegistration() {
        return ClientRegistration.withRegistrationId("google")
            .clientId("google-client-id")
            .clientSecret("google-client-secret")
            .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .redirectUri("{baseUrl}/login/oauth2/code/{registrationId}")
            .scope("openid", "profile", "email", "address", "phone")
            .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
            .tokenUri("https://www.googleapis.com/oauth2/v4/token")
            .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
            .userNameAttributeName(IdTokenClaimNames.SUB)
            .jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
            .clientName("Google")
            .build();
    }
 

Узнайте больше о переопределении автоконфигурации. Ссылка