7

Sono stato dimenarsi con il tutorial primavera Boot OAuth2 e io non riesco a ottenere un elemento di lavoro abbastanza chiave:Come funziona il reindirizzamento al login Spring Oauth2?

https://spring.io/guides/tutorials/spring-boot-oauth2/

voglio correre come un server di autorizzazione. Ho seguito le istruzioni il più attentamente possibile, ma quando vado sull'endpoint/oauth/authorize, tutto ciò che ottengo è una risposta Proibita 403. Questo rende davvero senso per me data la configurazione HttpSecurity che il tutorial imposta:

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .antMatcher("/**") 
     .authorizeRequests() 
     .antMatchers("/", "/login**", "/webjars/**") 
     .permitAll() 
     .anyRequest() 
     .authenticated() 
     .and().logout().logoutSuccessUrl("/").permitAll() 
     .and().csrf().csrfTokenRepository(csrfTokenRepository()) 
     .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class) 
     .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class); 
} 

La pagina di login per questo tutorial è in realtà l'indice principale e io sicuramente non vedo nulla nel tutorial che istruire l'Oauth sistema per reindirizzare il flusso di login lì.

riesco a farlo tipo di lavorazione aggiungendo questo:

 .and().formLogin().loginPage("/") 

... ma prima di andare avanti ho veramente voluto capire se questo è un problema con il tutorial o mia implementazione di esso o qualcos'altro . Qual è il meccanismo con cui il sistema di sicurezza Oauth decide che cos'è una pagina di "accesso"?

+0

Ciao @Ryan, hai già risolto questo? –

+0

Ho trovato una soluzione, ma non spiega come dovrebbe funzionare l'esempio. Quindi non sono ancora sicuro di cosa avrebbe causato il reindirizzamento del sistema di sicurezza a "/" per l'autenticazione in questo esempio. Pubblicherò la mia soluzione qui sotto per quello che vale. – Ryan

+0

Puoi postarlo? Fammi provare a spiegare se potrei scavare qualcosa. –

risposta

7

La soluzione era quella di aggiungere il seguente alla chiamata SecurityConfig.configure:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    AuthenticationEntryPoint aep = new AuthenticationEntryPoint() { 

     @Override 
     public void commence(HttpServletRequest request, 
       HttpServletResponse response, 
       AuthenticationException authException) throws IOException, 
       ServletException { 
      response.sendRedirect("/login"); 
     } 
    }; 

    http.exceptionHandling() 
      .authenticationEntryPoint(aep) 

che reindirizza il flusso di autenticazione a un URL specifico (in questo caso io mando a "/ login", ma ha funzionato anche con "/" o qualsiasi altra cosa ho scelto). Non ho idea di come il tutorial debba eseguire il reindirizzamento senza aggiungere esplicitamente questa riga.

-1

Non è necessario andare direttamente in/oauth/authorize endpoint. Questo è usato dietro le quinte e la pagina index.html è quella che il tutorial sta dimostrando.

+0

Successivamente nel tutorial impostiamo un secondo servizio che utilizza il primo come server di autorizzazione. Imposta oauth/authorize come endpoint di autorizzazione dell'utente. Il server di autorizzazione dovrebbe reindirizzare a una pagina di accesso. Funziona con l'autenticazione del modulo, ma non con gli accessi social esterni: "Per testare le nuove funzionalità puoi semplicemente eseguire entrambe le app e visitare 127.0.0.1:9999 nel tuo browser.L'app client reindirizzerà al server di autorizzazione locale, che quindi fornisce all'utente la scelta abituale di autenticazione con Facebook o Github. " – Ryan

+0

Ok, la tua domanda originale ha fatto sembrare che stavi per/oauth/authorize e non per la tua app client. – Kim

+0

Ho impostato questo tutorial in precedenza e non ho ricevuto l'errore 403 in questa parte del tutorial, ma il codice che hai incollato (meno la sezione loginPage()) sembra corretto. Quindi, l'errore di reindirizzare a/deve provenire da una diversa sezione di codice. L'app dovrebbe andare in/per impostazione predefinita. quindi chiamare il comando formLogin() non dovrebbe essere necessario a meno che tu non stia mettendo la pagina di login in un posto diverso da /. In un'altra app, l'ho impostato su/login, quindi uso questo comando. Dovrebbe esserci qualcosa di sbagliato nell'usare il comando formLogin() se è necessario. – Kim

2

Seguire la risposta this. 1. è necessario configurare le intestazioni sul proxy Apache:

<VirtualHost *:443> 
    ServerName www.myapp.org 
    ProxyPass/http://127.0.0.1:8080/ 
    RequestHeader set X-Forwarded-Proto https 
    RequestHeader set X-Forwarded-Port 443 
    ProxyPreserveHost On 
    ... (SSL directives omitted for readability) 
</VirtualHost> 

2. dovete dire al vostro avvio app Primavera di utilizzare queste intestazioni. Quindi metti la seguente riga nella tua application.properties (o in qualsiasi altro luogo in cui Spring Boots comprende le proprietà):

server.use-forward-headers=true 
Problemi correlati