使用oAuth2进行Spring引导OauthException:“您必须提供client_id”

时间:2016-05-03 19:33:03

标签: spring-boot instagram spring-security-oauth2 oauth2

在我的项目中,我尝试使用instagram验证用户身份。 该项目使用 spring-security-oauth2 spring-boot 上运行。 在身份验证阶段,我从Instagram code收到,该邮件将发送到Instagram以检索access_token。而不是access_token我通过消息收到错误的请求响应:"您必须提供client_id"。

WebSecurityConfig.class

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/", "/index**", "/login/**", "/webjars/**", "/js/**", "/css/**", "/images/**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))
            .and().logout().logoutSuccessUrl("/").permitAll()
            .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
            .addFilterBefore(ssoFilter(instagram(), "/login"), BasicAuthenticationFilter.class);
}
@Bean
@ConfigurationProperties("instagram")
ClientResources instagram() {
    return new ClientResources();
}

private Filter ssoFilter(ClientResources client, String path) {
    OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path) {

    };
    OAuth2RestTemplate filterTemplate = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
    filter.setRestTemplate(filterTemplate);
    filter.setTokenServices(new UserInfoTokenServices(client.getResource().getUserInfoUri(),
                                                              client.getClient().getClientId()));
    return filter;
}

application.properties

instagram.client.clientId=df5cc67d71e04b1b9a89ca9e1572a801
instagram.client.clientSecret=8da04f4072a54579ae4e334d5e865fa4
instagram.client.accessTokenUri=https://api.instagram.com/oauth/access_token
instagram.client.userAuthorizationUri=https://api.instagram.com/oauth/authorize
instagram.client.scope=basic, likes, comments, relationships
instagram.resource.userInfoUri=https://api.instagram.com/v1/users/self

Here是github上的那个项目。用于教育目的的项目,所以这里打开clientId和clientSecret。 感谢任何建议如何提前解决这个烦人的异常

1 个答案:

答案 0 :(得分:-1)

在OAuth2中有多个流程,我们可以在其中执行身份验证授权。您选择的流程是授权代码流程。

在Authrorization Code流程中,授权服务器将授权代码返回给用户代理(浏览器)。浏览器然后将该代码发回资源服务器(在服务器上运行的Api代码)。然后,服务器将该代码与客户端ID和客户端密钥交换为access_token。

客户端ID和机密是保密的,因此当您在基于Javascript的应用程序中使用OAuth2时,建议使用隐式流程。在此流程中,authrorization服务器使用access_token而不是授权代码进行响应。

如果这有用,或者您有任何其他问题,请与我们联系。

谢谢你, 索马。