使用谷歌持票人令牌访问我的API

时间:2016-11-28 14:43:36

标签: spring spring-security oauth google-oauth spring-security-oauth2

我已通过定义以下配置以及相应的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。天气它谷歌返回的令牌或春天生成的令牌并不重要。关于如何实现这一目标的任何线索?

1 个答案:

答案 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
  • 通过http://localhost:8080
  • 进行身份验证

您将在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;
}

必须在某处拦截客户的请求,所以这可能值得一看。