OAuth2 - 检索TOKEN时OPTIONS请求的状态401

时间:2015-06-03 14:12:08

标签: spring-security oauth-2.0 cors single-page-application restful-authentication

我们的堆栈使用Backbone作为客户端应用程序,使用Spring Boot作为RESTful API。

我们尝试使用OAuth2进行基本身份验证,用户提供用户名和密码。

我们使用Spring Security进行身份验证,使用jQuery $ .ajax方法进行请求。然而,我们得到的响应是在预检OPTIONS请求上的401(未授权)状态,然后我们甚至可以使用我们的秘密来授权POST头。 但是我们可以毫无问题地发布或获取任何其他资源。 OPTIONS请求的服务器响应是200(ok),然后它跟进POST请求。

那么,为什么来自/ oauth / token响应的OPTIONS请求具有401状态,即使它不应该?它不会让我们自己授权,因为它会停留在我们无法添加授权标头的OPTIONS请求中。

这就是我们处理前端请求的方式:

                $.ajax({
                url: "http://localhost:8080/oauth/token",
                type: "POST",
                beforeSend: function(xhr) { 
                    xhr.setRequestHeader("Authorization", "Basic Y2xpZW50YXBwOjEyMzQ1Ng==");
                },
                data: {
                    password: "qwerty",
                    username: "jkowalski",
                    grant_type: "password"
                }
            });

这是我们的OAuth2配置:

@Configuration
public class OAuth2ServerConfiguration {

private static final String RESOURCE_ID = "restservice";

@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends
        ResourceServerConfigurerAdapter {

    [...]

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();

        http
        .authorizeRequests()
            .anyRequest().permitAll();
    }

}

[...]

@Configuration
@EnableAuthorizationServer
protected static class OAuth2AuthorizationConfig extends
        AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        // @formatter:off
        clients
            .inMemory()
                .withClient("clientapp")
                    .authorizedGrantTypes("password", "refresh_token")
                    .authorities("USER","ADMIN")
                    .scopes("read", "write")
                    .resourceIds(RESOURCE_ID)
                    .secret("123456");
        // @formatter:on
    }

[...]
}

1 个答案:

答案 0 :(得分:1)

我可以在理论上回答你的问题:

  

那么,为什么来自/ oauth / token响应的OPTIONS请求具有401状态,即使它不应该?它不会让我们自己授权,因为它会停留在我们无法添加授权标头的OPTIONS请求中。

这是因为default configuration of the AuthServer仅允许在令牌端点处进行完全认证的请求。

在您的资源服务器中,您允许所有请求在未经身份验证的情况下发生:Project

我试图像提到here那样解决这种情况,但我无法为我解决这个问题。

为了完整起见,我在此提及,您必须添加CorsFilter以向OPTIONS预检请求添加正确的标题。

I also asked a very similar question,所以如果我的答案得到解答,你也可以用这些信息来解决你的问题。