Spring Boot OAuth2-не удалось получить сведения о пользователе из токена
Я искал в интернете для решения этой проблемы, но не нашел рабочего решения. Я пытаюсь настроить базовый поставщик и клиент авторизации Spring Boot OAuth2.
я следовал официальным инструкциям Spring Boot и создал единый вход с Facebook и Github. Затем я выполнил инструкции по созданию безопасного веб-приложения Spring Boot.
Я хотел создать свой собственный сервер авторизации, поэтому я добавил аннотацию @EnableAuthorizationServer в Secure Web Применение как объяснено здесь. Я также добавил сведения о клиенте OAuth2, как описано в ссылке. Я выполнил дальнейшие инструкции и создал клиент OAuth2.
Я запускаю оба приложения, посетите 127.0.0.1:9999, чтобы открыть клиент, клиент перенаправляет меня на localhost: 8080 / login, я ввожу данные пользователя и поставщик аутентификации перенаправляет меня на 127.0.0.1: 9999/login, и я получаю сообщение об ошибке:
ошибка аутентификации: не удалось получить сведения о пользователе от токена
Это что заносится:
информация 2800 --- [НИО-9999-экзек-3] о'.С. б.а.С. о'.Р.UserInfoTokenServices : получение информации от пользователя: http:// локальный:8080/я
отладка 2800 --- [НИО-9999-экзек-3] о'.С. С. что OAuth2.клиент.OAuth2RestTemplate: создан запрос GET для http:/ / localhost: 8080 / me
отладка 2800 --- [НИО-9999-экзек-3] о'.С. С. что OAuth2.клиент.OAuth2RestTemplate: установка заголовка запроса Accept в [приложение / json, приложение/ * +json]
отладка 2800 --- [НИО-9999-экзек-3] о'.С. С. что OAuth2.клиент.OAuth2RestTemplate: получить запрос на http:/ / localhost:8080 / me привело к 200 (OK)
информация 2800 --- [НИО-9999-экзек-3] о'.С. б.а.С. о'.Р.UserInfoTokenServices : не удалось получить сведения о пользователе: класс org.springframework.сеть.клиент.RestClientException, не удалось извлечь ответ: не найден подходящий HttpMessageConverter для типа ответа [интерфейс java.утиль.Карта] и тип содержимого [text / html; charset=UTF-8]]
Это мое клиентское приложение:
@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);
    }
}
это клиентское приложение 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
Это мое приложение поставщика авторизации:
@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;
    }
}
это поставщик приложений YML:
security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      scope: read,write
      auto-approve-scopes: '.*'
            1 ответов
Я решил проблему! Мне не хватало сервера ресурсов, который обрабатывает запросы на конечную точку пользователя (user-info-uri). В приложение поставщика авторизации я добавил этот класс:
@Configuration
@EnableResourceServer
public class ResourceServer
        extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/me")
            .authorizeRequests().anyRequest().authenticated();
    }
}