Spring OAuth2 Создание параметра `state` длиной не менее 32 символов - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь авторизоваться против внешнего провайдера идентификации. Кажется, все настроено нормально, но я получаю ошибку проверки с моим провайдером идентификации, потому что параметр state, автоматически привязанный к моему запросу на авторизацию, недостаточно длинный:

Например: &state=uYG5DC

Требования моего IDP говорят, что этот параметр state должен быть длиной не менее 32 символов. Как я могу программно увеличить размер этого автоматически сгенерированного числа?

Даже если бы я мог сгенерировать это число самостоятельно, невозможно переопределить другие предложенные мной методы. Следующая попытка не удалась, потому что моя ручная установка ?state=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz заменена автоматически сгенерированным параметром, помещенным после него во время фактического запроса:

@Bean public OAuth2ProtectedResourceDetails loginGovOpenId() { AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails() { @Override public String getUserAuthorizationUri() { return super.getUserAuthorizationUri() + "?state=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"; } }; details.setClientId(clientId); details.setAccessTokenUri(accessTokenUri); details.setUserAuthorizationUri(userAuthorizationUri); details.setScope(Arrays.asList("openid", "email")); details.setPreEstablishedRedirectUri(redirectUri); details.setUseCurrentUri(true); return details; }

Кажется, здесь установлена ​​6-символьная настройка, есть ли способ переопределить это? https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/common/util/RandomValueStringGenerator.java

1 Ответ

0 голосов
/ 20 ноября 2018

С помощью этого поста: Spring Security. Пользовательский экземпляр StateKeyGenerator

Мне удалось найти рабочее решение.

В моем классе конфигурации, отмеченном какэти аннотации:

@Configuration @EnableOAuth2Client

Я настроил следующие компоненты:

    @Bean
public OAuth2ProtectedResourceDetails loginGovOpenId() {
    AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
    AuthorizationCodeResourceDetails details = new 
    details.setClientId(clientId);
    details.setClientSecret(clientSecret);
    details.setAccessTokenUri(accessTokenUri);
    details.setUserAuthorizationUri(userAuthorizationUri);
    details.setScope(Arrays.asList("openid", "email"));
    details.setPreEstablishedRedirectUri(redirectUri);
    details.setUseCurrentUri(true);
    return details;
}

@Bean
public StateKeyGenerator stateKeyGenerator() {
    return new CustomStateKeyGenerator();
}

@Bean
public AccessTokenProvider accessTokenProvider() {
    AuthorizationCodeAccessTokenProvider accessTokenProvider = new AuthorizationCodeAccessTokenProvider();
    accessTokenProvider.setStateKeyGenerator(stateKeyGenerator());
    return accessTokenProvider;
}

@Bean
public OAuth2RestTemplate loginGovOpenIdTemplate(final OAuth2ClientContext clientContext) {
    final OAuth2RestTemplate template = new OAuth2RestTemplate(loginGovOpenId(), clientContext);
    template.setAccessTokenProvider(accessTokenProvider());
    return template;
}

Где мой класс реализации CustomStateKeyGenerator выглядит следующим образом:

public class CustomStateKeyGenerator implements StateKeyGenerator {

  // login.gov requires state to be at least 32-characters long
  private static int length = 32;
  private RandomValueStringGenerator generator = new RandomValueStringGenerator(length);

  @Override
  public String generateKey(OAuth2ProtectedResourceDetails resource) {
      return generator.generate();
  }
}
...