我已通过定义以下配置以及相应的application.yml文件来启用Google身份验证。
@EnableOAuth2Sso
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"));
}
}
我可以通过浏览器访问我的各种端点。但客户端可能并不总是一个浏览器。
我有一个定义如下的控制器方法
@GetMapping("/user")
public Principal getUser(Principal principal) {
return principal;
}
从Principal返回后,我可以看到类型为Bearer的tokenValue。我如何使用它来对付我的api?或者另一个令牌。我只是想使用google auth和oauth访问我自己的api。
wget -i http://localhost:8080/user -H "Authorization: Bearer $TOKEN"
将我重定向到登录页面。
为了澄清一点,我想使用google auth进行身份验证,但是能够使用oauth访问我的api。天气它谷歌返回的令牌或春天生成的令牌并不重要。关于如何实现这一目标的任何线索?
答案 0 :(得分:1)
您可以查看spring's tutorial focusing on oauth2,然后查看github项目。他们有一个很好的auth-server项目,你可以找到你想要实现的例子。
git clone https://github.com/spring-guides/tut-spring-boot-oauth2.git
auth-server
的Spring启动项目
cd auth-server && mvn spring-boot:run
您将在auth-server端(api服务器)发现OAuth2Authentication
主体可用,并且可以使用承载令牌。如果用户通过身份验证,您可以使用此auth-server示例来设计Controller返回此令牌。
curl -X GET "http://localhost:8080/me" -H "Authorization: Bearer 22e70fcf-eb60-483c-9105-xxxx"
在我的测试中,我收到了以下回复:{"name":"674008369426415"}
curl -X GET "http://localhost:8080/me"
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
查看您的代码,我认为您错过了Spring教程中的SSO Filter部分:
http.antMatcher("/**")
// more configuration here
.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
和
@Bean
public FilterRegistrationBean oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(filter);
registration.setOrder(-100);
return registration;
}
必须在某处拦截客户的请求,所以这可能值得一看。