Spring Boot OAuth2 - Failed to get user data from token

I searched the Internet for a solution to this problem, but did not find any working solution. I am trying to install the basic Spring Boot OAuth2 Authorization Provider and Client.

I followed the official Spring Boot instructions and created one sign with Facebook and Github. Then I followed the instructions to create a secure Spring boot web application.

I wanted to create my own authorization server, so I added the @EnableAuthorizationServer annotation to a secure web application, as described here . I also added OAuth2 client details as described in the link. I followed the instructions and created the OAuth2 client.

I run both applications, go to 127.0.0.1:9999 to open the client, the client redirects me to localhost: 8080 / login, I enter the user information, and the authentication provider redirects me to 127.0.0.1:9999/login, and I I get an error message:

Authentication Error: Failed to get user data from token

This is what is logged:

INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices: getting user information from: http: // localhost: 8080 / me

DEBUG 2800 --- [nio-9999-exec-3] ossauto.client.OAuth2RestTemplate: GET request created for http: // localhost: 8080 / me

DEBUG 2800 --- [nio-9999-exec-3] ossauto2.client.OAuth2RestTemplate: setting option Accept header to [application / json, application / * + json]

DEBUG 2800 --- [nio-9999-exec-3] ossauto2.client.OAuth2RestTemplate: GET request for http: // localhost: 8080 / me resulted in 200 (OK)

INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices: failed to get user data: class org.springframework.web.client.RestClientException, failed to retrieve response: no suitable HttpMessageConverter for response type was found [java.util interface .Map] and content type [text / html; charset = UTF-8]]

This is my client application:

@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); } } 

This is the YML client application:

 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 

This is my authorization provider application:

 @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; } } 

This is the YML application provider:

 security: oauth2: client: client-id: acme client-secret: acmesecret scope: read,write auto-approve-scopes: '.*' 
+6
source share
1 answer

I solved the problem! I missed the Resource Server, which handles user endpoint requests (user-info-uri). In the Authorization Provider application, I added this class:

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

All Articles