web-dev-qa-db-fra.com

Spring OAuth redirect_uri n'utilise pas https

J'ai une application Spring Boot 1.3.0 avec Spring Security OAuth incluse comme une sorte d'intégration SSO.

Le problème est que l'application s'exécute dans un environnement non SSL avec un port non standard derrière un équilibreur de charge (F5) qui force SSL et le fournisseur OAuth exige que toutes les URL de redirection soient enregistrées en tant que https, mais le client Spring OAuth (auto -configured with @EnableOAuthSso) ne redirigera que vers le fournisseur OAuth avec l'URL suivante ...

https: // [hôte_fournisseur]/oauth/authorize? client_id = [éditer]& redirect_uri = http: // [hôte_application]/login & type_réponse = code & scope = [rédiger] & state = IpMYTe

Notez que le retour redirect_uri est généré en tant que http. Même si le F5 le forcera à https au retour, notre fournisseur OAuth n'autorisera pas l'URI de redirection non SSL. Comment puis-je configurer cela?

À l'exception de mes contrôleurs Spring Data JPA, voici l'intégralité de l'application ...

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
12
Zack Hoffmann

Après avoir fouillé manuellement dans les classes de configuration, j'ai pu trouver et ajouter ce qui suit, ce qui a fait l'affaire ...

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

Je ne suis pas convaincu qu'il n'existe pas de meilleur moyen de résoudre le problème du forçage d'une URL de redirection HTTPS, mais ce correctif a fonctionné pour moi. 

16
Zack Hoffmann

Vous devrez peut-être vous assurer que votre application comprend les en-têtes x-forwarded de votre équilibreur de charge.

Mettre ceci dans mon application.yml corrige mon problème très similaire avec une application derrière un AWB ELB:

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

Edit: Ceci peut être simplifié avec la configuration plus générique:

server:
  use-forward-headers: true
5
MikeeMike

J'ai eu le même problème ... J'ai ajouté ces deux paramètres pour forcer HTTPS dans redirect_uri

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

Cela fonctionne: "redirect_uri" utilise maintenant HTTPS

0
BenoitJ

vous devrez peut-être utiliser spring.oauth2.client.access-token-uri

paramètre de configuration modifié après 1.3.0.M1

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3.0-M1-Configuration-Changelog

0
Yuki Yoshida