我在网上搜索了这个问题的解决方案,但没有找到任何可行的解决方案。我正在尝试设置基本的Spring Boot OAuth2授权提供程序和客户端。
我遵循官方的Spring Boot说明,并使用Facebook和Github创建了单点登录。然后我按照说明创建了Secure Spring Boot Web应用程序。
我想创建自己的授权服务器,因此我按照here的说明将@EnableAuthorizationServer注释添加到Secure Web Application。我还添加了一个OAuth2客户端的详细信息,如链接中所述。我按照进一步的说明创建了OAuth2客户端。
我启动两个应用程序,访问127.0.0.1:9999打开客户端,客户端将我重定向到localhost:8080 / login,我输入用户详细信息,身份验证提供程序将我重定向到127.0.0.1:9999/login我得到一个错误讯息:
身份验证失败:无法从令牌
获取用户详细信息
这是记录的内容:
INFO 2800 --- [nio-9999-exec-3] o.s.b.a.s.o.r.UserInfoTokenServices:获取用户信息:http:// localhost:8080 / me
DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:为http:// localhost:8080 / me创建了GET请求
DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:设置请求接受标题为[application / json,application / * + json]
DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:对http:// localhost:8080 / me的GET请求导致200(OK)
INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices:无法获取用户详细信息:class org.springframework.web.client.RestClientException,无法提取响应:没有为响应类型找到合适的HttpMessageConverter [接口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);
}
}
这是客户端应用程序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: '.*'
答案 0 :(得分:7)
我解决了这个问题!我错过了处理用户端点请求的资源服务器(user-info-uri)。对于授权提供程序应用程序,我添加了这个类:
@Configuration
@EnableResourceServer
public class ResourceServer
extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/me")
.authorizeRequests().anyRequest().authenticated();
}
}
答案 1 :(得分:-1)
user-info-uri 应该在授权服务器中,因为所有帐户/用户都在其中。