当前位置: 首页 > 知识库问答 >
问题:

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

孟豪
2023-03-14

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

我按照官方的Spring Boot指令,创建了Facebook和GitHub的单点登录。然后按照说明创建安全的Spring Boot Web应用程序。

以下是记录的内容:

信息2800---[nio-9999-exec-3]O.S.B.A.S.O.R.UserInfoTokenServices:从:http://localhost:8080/me获取用户信息

调试2800---[nio-9999-exec-3]O.ss.oauth2.client.oauth2RestTemplate:创建了对http://localhost:8080/Me的GET请求

调试2800---[nio-9999-exec-3]O.ss.oauth2.client.oauth2RestTemplate:获取对http://localhost:8080/Me的请求,结果为200(可以)

信息2800---[nio-9999-exec-3]O.S.B.A.S.O.R.UserInfoTokenServices:无法获取用户详细信息:类org.SpringFramework.web.client.RestClientException,无法提取响应:找不到响应类型[interface java.util.map]和内容类型[text/html;charset=utf-8]]的合适的HttpMessageConverter

这是我的客户端应用程序:

@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;
    }
}
security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      scope: read,write
      auto-approve-scopes: '.*'

共有1个答案

姚鹤龄
2023-03-14

我解决了问题!我缺少处理用户endpoint(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();
    }
}
 类似资料:
  • 我正在一个项目,其中有要求的Gmail认证,也可以扩展。我在这里遵循这个教程,其中有关于Facebook和GitHub身份验证的示例。所以我尝试了Gmail,我得到了这个错误,我无法解决,并得到了新的异常时,试图解决。请帮助我,因为我相信这是代码受我添加的影响最小的地方。有了这么多的配置和代码,它只适用于github和fb,但不适用于Google。 socialapplication.java b

  • 是否可以使用OAuth 2访问令牌从ForgeRock的OpenAM获取用户详细信息(属于资源所有者的属性)? 我有一个受信任的SPA UI,可以使用资源所有者密码凭据授予类型从OpenAM获取访问令牌。然而,该访问令牌没有提供有关资源所有者的信息。类似地,endpoint没有提供任何信息。 OpenAM似乎有用于列出用户属性的endpoint,但是期望使用JWT作为请求的身份验证手段。 如何从访

  • 我在我的nodejs应用程序中为注册用户在keybeat上实现了keybeat,我使用的登录API是: 如果用户名和密码正确,则返回登录用户的令牌, 现在我需要传递这个令牌(通过上面的API返回),并检查这个令牌是否正确,如果令牌正确,我需要用户详细信息,是否有用于此的API。 提前谢谢

  • 当我在accessTokenUri中提供域名时,它不起作用并报告错误,但当我提供localhost时,它起作用。为什么? 授权服务器Config.java ResourceServerConfig.java 错误: 2018-09-14 12:00:13.083信息25836---[main]o.s.j.e.a。AnnotationMBeanExporter:Located managed bea

  • 我是Spring MVC和Spring Security的新手。我已经使用Spring Security和MVC执行了登录和注册功能。我找不到任何会话管理的方法。 我想访问所有页面上的一些用户信息,如(电子邮件,姓名,id,角色等)。我想将这些保存到会话对象中,这样我就可以在任何页面上获取这些内容。 我在Spring的会议得到以下方式 但是从这个返回的对象中,我只能得到用户名和密码的详细信息。 但