Spring OAuth redirect_uri не использует https

У меня есть приложение Spring Boot 1.3.0 с Spring Security OAuth, которое входит как своего рода интеграция с SSO.

Проблема в том, что приложение работает в среде без SSL с нестандартным портом за балансировщиком нагрузки (F5), который заставляет SSL и провайдера OAuth требовать, чтобы все URL-адреса переадресации регистрировались как https, но клиент Spring OAuth (авто -конфигурировано с помощью @EnableOAuthSso) будет перенаправляться только поставщику OAuth со следующим URL-адресом...

https://[provider_host]/oauth/authorize? client_id = [redact] & redirect_uri = http://[application_host]/login & response_type = code & scope = [redact] & state = IpMYTe

Обратите внимание, что возвращаемый redirect_uri создается как http. Несмотря на то, что F5 заставит его https на обратном пути, наш поставщик OAuth не разрешит URI с переадресацией без SSL. Как я могу настроить это?

За исключением контроллеров Spring Data JPA, это всего лишь приложение...

AppConfig.java

@SpringBootApplication(exclude = { HibernateJpaAutoConfiguration.class })
@EnableJpaRepositories
public class AppConfig extends SpringBootServletInitializer {

    public static void main(final String... args) {
        SpringApplication.run(AppConfig.class, args);
    }

    @Autowired
    public DataSource dataSource;

    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryInfo() {
        final LocalContainerEntityManagerFactoryBean fac = new LocalContainerEntityManagerFactoryBean();
        fac.setDataSource(dataSource);
        fac.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        fac.setPackagesToScan("[redact]");

        final Properties props = new Properties();
        props.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
        props.put("hibernate.show_sql", "true");
        props.put("hibernate.format_sql", "true");
        fac.setJpaProperties(props);

        return fac;
    }

    @Bean(name = "transactionManager")
    public PlatformTransactionManager getTransactionManager() {
        final JpaTransactionManager transactMngr = new JpaTransactionManager();
        transactMngr.setEntityManagerFactory(getEntityManagerFactoryInfo().getObject());
        return transactMngr;
    }

}

SecurityConfig.java

@Configuration
@EnableOAuth2Sso
public class SecurityConfig {

}

application.properties

server.port=9916
server.contextPath=

server.use-forward-headers=true

security.oauth2.client.clientId=[redact]
security.oauth2.client.clientSecret=[redact]
security.oauth2.client.scope=[redact]
security.oauth2.client.accessTokenUri=https://[provider_host]/oauth/token
security.oauth2.client.userAuthorizationUri=https://[provider_host]/oauth/authorize
security.oauth2.resource.userInfoUri=https://[provider_host]/oauth/me
security.oauth2.resource.preferTokenInfo=false

logging.level.org.springframework=TRACE

Ответ 1

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

security.oauth2.client.pre-established-redirect-uri=https://[application_host]/login
security.oauth2.client.registered-redirect-uri=https://[application_host]/login
security.oauth2.client.use-current-uri=false

Я не уверен, что нет лучшего способа решить проблему принудительного URL-адреса перенаправления HTTPS, но это исправление сработало для меня.

Ответ 2

Возможно, вам нужно будет убедиться, что ваше приложение понимает x-forwarded заголовки из вашего балансировщика нагрузки.

Поместив это в мое приложение application.yml, я установил очень похожую проблему с приложением, расположенным за AWB ELB:

server:
  tomcat:
    remote-ip-header: x-forwarded-for
    protocol-header: x-forwarded-proto

Изменить: это может быть упрощено с более общей конфигурацией:

server:
  use-forward-headers: true

Ответ 4

У меня такая же проблема. Я добавляю тезисы двух параметров, чтобы заставить HTTPS в redirect_uri:

preEstablishedRedirectUri: https://...
useCurrentUri: false

Он работает: "redirect_uri" теперь использует HTTPS