Spring Boot OAuth2 - 无法从令牌获取用户详细信息

dpl*_*esa 7 spring spring-security oauth-2.0 spring-boot spring-security-oauth2

我在网上搜索了这个问题的解决方案,但没有找到任何可行的解决方案.我正在尝试设置基本的Spring Boot OAuth2授权提供程序和客户端.

我遵循官方的Spring Boot说明,并在Facebook和Github上创建了单点登录.然后我按照说明创建了Secure Spring Boot Web应用程序.

我想创建自己的授权服务器,所以我说@EnableAuthorizationServer注释到安全Web应用程序作为解释在这里.我还添加了一个OAuth2客户端的详细信息,如链接中所述.我按照进一步说明创建了OAuth2客户端.

我启动这两个应用程序,访问127.0.0.1:9999打开客户端,客户端将我重定向到localhost:8080/login,我输入用户详细信息,身份验证提供程序将我重定向到127.0.0.1:9999/login,我收到一条错误消息:

身份验证失败:无法从令牌获取用户详细信息

这是记录的内容:

INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices:获取用户信息:http:// localhost:8080/me

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate:为http:// localhost:8080/me创建了GET请求

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate:设置请求接受标题为[application/json,application/*+ json]

DEBUG 2800 --- [nio-9999-exec-3] ossoauth2.client.OAuth2RestTemplate:对http:// localhost:8080/me的GET请求导致200(OK)

INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices:无法获取用户详细信息:class org.springframework.web.client.RestClientException,无法提取响应:没有为响应类型找到合适的HttpMessageConverter [interface java.util .Map]和内容类型[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);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是客户端应用程序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
Run Code Online (Sandbox Code Playgroud)

这是我的授权提供商应用程序:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是应用程序提供商YML:

security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      scope: read,write
      auto-approve-scopes: '.*'
Run Code Online (Sandbox Code Playgroud)

dpl*_*esa 7

我解决了这个问题!我错过了处理用户端点请求的资源服务器(user-info-uri).对于Authorization Provider应用程序,我添加了这个类:

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

  • 你在哪里把/ me uri的映射放在认证服务器上? (3认同)