6

Przeszukałem internet pod kątem rozwiązania tego problemu, ale nie znalazłem żadnego działającego rozwiązania. Próbuję skonfigurować podstawowego dostawcę autoryzacji Spring Boot OAuth2 i klienta.Spring Boot OAuth2 - Nie można uzyskać danych użytkownika z tokena

Śledziłem oficjalne instrukcje Spring Boot i stworzyłem pojedyncze logowanie na Facebooku i Githubie. Następnie postępowałem zgodnie z instrukcjami, aby utworzyć bezpieczną aplikację Spring Boot Web.

Chciałem stworzyć swój własny Serwer autoryzacji, więc dodałem adnotację @EnableAuthorizationServer do Bezpiecznej aplikacji internetowej, jak wyjaśniono here. Dodałem również szczegóły klienta OAuth2 zgodnie z opisem w łączu. Postępowałem zgodnie z dalszymi instrukcjami i utworzyłem klienta OAuth2.

Uruchamiam obie aplikacje, odwiedzam 127.0.0.1:9999, aby otworzyć klienta, klient przekierowuje mnie na localhost: 8080/login, wpisuję dane użytkownika, a dostawca uwierzytelniania przekierowuje mnie na adres 127.0.0.1:9999/login i otrzymuję komunikat o błędzie:

Uwierzytelnienie nie powiodło się: nie można uzyskać dane użytkowników z tokena

to co zostanie zalogowany:

INFO 2800 --- [nio-9999 -exec-3] osbasorUserInfoTokenServices: Uzyskiwanie informacji o użytkowniku od: http: // localhost: 8080/me

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate: Utworzono żądanie GET dla http: // localhost: 8080/me

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate: Ustawienie żądania Zaakceptuj nagłówek [aplikacja/json, application/* + json ]

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate: GET żądania do http: // localhost: 8080/me spowodowało 200 (OK)

INFO 28 00 --- [nio-9999-exec-3] osbasorUserInfoTokenServices: Nie można pobrać danych użytkownika: class org.springframework.web.client.RestClientException, Nie można wyodrębnić odpowiedzi: nie znaleziono odpowiedniego obiektu HttpMessageConverter dla typu odpowiedzi [interface java.util .map] oraz typ zawartości [text/html; charset = UTF-8]]

to moja aplikacja klient:

@EnableAutoConfiguration 
@Configuration 
@EnableOAuth2Sso 
@RestController 
public class ClientApplication { 

    @RequestMapping("/") 
    public String home(Principal user) { 
     return "Hello " + user.getName(); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(ClientApplication.class, args); 
    } 

} 

jest to aplikacja kliencka yml:

server: 
    port: 9999 
security: 
    oauth2: 
    client: 
     client-id: acme 
     client-secret: acmesecret 
     access-token-uri: http://localhost:8080/oauth/token 
     user-authorization-uri: http://localhost:8080/oauth/authorize 
    resource: 
     user-info-uri: http://localhost:8080/me 

To jest mój Aplikacja Provider odpowiedzialny:

@SpringBootApplication 
public class SecurityApp { 

    public static void main(String[] args) { 
     SpringApplication.run(SecurityApp.class, args); 
    } 

} 

@Configuration 
@EnableWebSecurity 
@EnableAuthorizationServer 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/", "/home").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
       .permitAll(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
       .withUser("user").password("password").roles("USER"); 
    } 
} 

@Configuration 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/home").setViewName("home"); 
     registry.addViewController("/").setViewName("home"); 
     registry.addViewController("/hello").setViewName("hello"); 
     registry.addViewController("/login").setViewName("login"); 
    } 

} 

@RestController 
public class Controller { 

    @RequestMapping({ "/user", "/me" }) 
    public Map<String, String> user(Principal principal) { 
     Map<String, String> map = new LinkedHashMap<>(); 
     map.put("name", principal.getName()); 
     return map; 
    } 
} 

Jest dostawcy aplikacji yml:

security: 
    oauth2: 
    client: 
     client-id: acme 
     client-secret: acmesecret 
     scope: read,write 
     auto-approve-scopes: '.*' 

Odpowiedz

6

I rozwiązać ten problem! Brakowało mi serwera zasobów, który obsługuje żądania dotyczące punktu końcowego użytkownika (user-info-uri). Do aplikacji dostawcy autoryzacji dodałem tę klasę:

@Configuration 
@EnableResourceServer 
public class ResourceServer 
     extends ResourceServerConfigurerAdapter { 
    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatcher("/me") 
      .authorizeRequests().anyRequest().authenticated(); 
    } 
} 
+2

Gdzie umieściłeś mapowanie dla/u uri w serwerze uwierzytelniania? –

+0

Wygląda jak przewodnik po tym na stronie https://spring.io/guides/tutorials/spring-boot-oauth2/ po prostu mówi, aby wypróbować go przed wykonaniem tego niezbędnego kroku (który jest następny) i innego. Miałem ten sam problem. –