Spring Boot OAuth2 - GoogleApi-无法从令牌

时间:2016-08-24 10:58:49

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

我正在开发一个项目,该项目具有Gmail身份验证要求,也可以进行扩展。 我正在关注本教程here,其中包含Facebook和GitHub身份验证的示例。所以我尝试使用Gmail,我收到此错误,我无法解决此问题,并在尝试解决时遇到新的异常。请帮助我,因为我相信这是代码受我的添加影响最小的点。有了这么多的配置和代码,它适用于github和fb,但不适用于谷歌。

SocialApplication.java

@SpringBootApplication
@RestController
@EnableOAuth2Client
@EnableAuthorizationServer
@Order(6)
public class SocialApplication extends WebSecurityConfigurerAdapter {

    @Autowired
    OAuth2ClientContext oauth2ClientContext;

    @RequestMapping({ "/user", "/me" })
    public Map<String, String> user(Principal principal) {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("name", principal.getName());
        return map;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**", "/webjars/**").permitAll().anyRequest()
                .authenticated().and().exceptionHandling()
                .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")).and().logout()
                .logoutSuccessUrl("/").permitAll().and().csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
                .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
        // @formatter:on
    }

    @Configuration
    @EnableResourceServer
    protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
        @Override
        public void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            http.antMatcher("/me").authorizeRequests().anyRequest().authenticated();
            // @formatter:on
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(SocialApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter);
        registration.setOrder(-100);
        return registration;
    }

    @Bean
    @ConfigurationProperties("github")
    ClientResources github() {
        return new ClientResources();
    }

    @Bean
    @ConfigurationProperties("facebook")
    ClientResources facebook() {
        return new ClientResources();
    }

    **@Bean
    @ConfigurationProperties("gmail")
    ClientResources gmail(){return new ClientResources();}**

    private Filter ssoFilter() {
        CompositeFilter filter = new CompositeFilter();
        List<Filter> filters = new ArrayList<>();
        filters.add(ssoFilter(facebook(), "/login/facebook"));
        filters.add(ssoFilter(github(), "/login/github"));
        **filters.add(ssoFilter(gmail(), "/login/gmail"));**
        filter.setFilters(filters);
        return filter;
    }

    private Filter ssoFilter(ClientResources client, String path) {
        OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationFilter = new OAuth2ClientAuthenticationProcessingFilter(
                path);
        OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
        oAuth2ClientAuthenticationFilter.setRestTemplate(oAuth2RestTemplate);
        UserInfoTokenServices tokenServices = new UserInfoTokenServices(client.getResource().getUserInfoUri(),
                client.getClient().getClientId());
        tokenServices.setRestTemplate(oAuth2RestTemplate);
        oAuth2ClientAuthenticationFilter.setTokenServices(tokenServices);
        return oAuth2ClientAuthenticationFilter;
    }

}

class ClientResources {
    private OAuth2ProtectedResourceDetails client = new AuthorizationCodeResourceDetails();
    private ResourceServerProperties resource = new ResourceServerProperties();

    public OAuth2ProtectedResourceDetails getClient() {
        return client;
    }

    public ResourceServerProperties getResource() {
        return resource;
    }
}

的index.html

<div>
    With Facebook: <a href="/login/facebook">click here</a>
</div>
<div>
    With Github: <a href="/login/github">click here</a>
</div>
**<div>
    With Gmail: <a href="/login/gmail">click here</a>
</div>**

application.yml //跳过github和fb的内容以节省空间

gmail:
  client:
    client_id: 7xxxxxxxx-1spjexxxxxxxc.apps.googleusercontent.com
    scope: https://www.googleapis.com/auth/userinfo.profile
    client_secret: Xxxxxxx-I*****zx
    userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
    accessTokenUri: https://accounts.google.com/o/oauth2/token
    auth_provider_x509_cert_url:https://www.googleapis.com/oauth2/v1/certs

LOG

  

org.springframework.security.authentication.BadCredentialsException:   无法从令牌获取用户详细信息   org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter.attemptAuthentication(OAuth2ClientAuthenticationProcessingFilter.java:122)   〜[spring-security-oauth2-2.0.10.RELEASE.jar:na] at   org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)   [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at   org.springframework.web.filter.CompositeFilter $ VirtualFilterChain.doFilter(CompositeFilter.java:112)   [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] at   org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)   [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at   org.springframework.web.filter.CompositeFilter $ VirtualFilterChain.doFilter(CompositeFilter.java:112)   [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] at   org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)   [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] at   org.springframework.web.filter.CompositeFilter $ VirtualFilterChain.doFilter(CompositeFilter.java:112)   [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] at   org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)   [弹簧网络4.3.2.RELEASE.jar:4.3.2.RELEASE]

     

**引起:   org.springframework.security.oauth2.common.exceptions.InvalidTokenException:   雅*********** dCCnRbsve3     在   org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices.loadAuthentication(UserInfoTokenServices.java:91)   〜[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] at   org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter.attemptAuthentication(OAuth2ClientAuthenticationProcessingFilter.java:112)   〜[spring-security-oauth2-2.0.10.RELEASE.jar:na] ... 66个常见帧   省略

在Google API控制台上。

我提供的重定向网址为: localhost:8080 / login / gmail

1 个答案:

答案 0 :(得分:4)

在你的application.yml确认中,我找不到定义的userinfo网址? 我有以下谷歌配置为我工作:

google:
  client:
    clientId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    clientSecret: YYYYYYYYYYYYYYYYYY
    accessTokenUri: https://accounts.google.com/o/oauth2/token
    userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
    clientAuthenticationScheme: form
    scope: profile email
  resource:
    userInfoUri: https://www.googleapis.com/userinfo/v2/me