OAuth2 - 检索令牌时选项请求的状态 401

OAuth2 - Status 401 on OPTIONS request while retrieving TOKEN

我们的堆栈使用 Backbone 作为我们的 client-side 应用程序和 Spring 引导作为 RESTful API.

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

我们使用 Spring 安全性进行身份验证,并使用 jQuery $.ajax 方法进行请求。然而,在我们甚至可以 POST header 使用我们的秘密进行授权之前,我们得到的响应是预检 OPTIONS 请求的 401(未授权)状态。 但是,我们可以 POST 或 GET 任何其他资源而不会出现任何问题。 OPTIONS 请求的服务器响应是 200(ok),然后是 POST 请求。

那么,为什么来自 /oauth/token 的 OPTIONS 请求会以 401 状态响应,即使它不应该响应?它不会让我们自己授权,因为它卡在我们无法添加授权的 OPTIONS 请求中 header.

这就是我们在 front-end 上处理请求的方式:

                $.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
    }

[...]
}

我只能从理论上回答你的问题:

So why is that an OPTIONS request from /oauth/token responses with 401 status even when it shouldn't? It won't let us authorize ourselves because it get's stuck at OPTIONS request in which we can't add authorization header.

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

在您的资源服务器中,您允许所有请求在没有身份验证的情况下发生:http.authorizeRequests().anyRequest().permitAll();

我试过像上面提到的那样解决这种情况 here,但我无法让它为我工作。

为了完整起见,我还在这里提到,您必须添加 CorsFilter 才能将正确的 Headers 添加到 OPTIONS 预检请求中。

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