#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();
}
Узнайте больше о переопределении автоконфигурации. Ссылка