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

Posted

技术标签:

【中文标题】OAuth2 - 检索令牌时 OPTIONS 请求的状态 401【英文标题】:OAuth2 - Status 401 on OPTIONS request while retrieving TOKEN 【发布时间】:2015-08-17 19:29:50 【问题描述】:

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

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

我们使用 Spring Security 进行身份验证,使用 jQuery $.ajax 方法发出请求。然而,我们得到的响应是预检 OPTIONS 请求的 401(未授权)状态,然后我们甚至可以发布带有我们授权的秘密的标头。 但是,我们可以毫无问题地 POST 或 GET 任何其他资源。 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】:

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

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

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

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

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

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

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

【讨论】:

解决了我的问题,这也应该对你有用!查看我的 CorsFilter:***.com/a/30638914/1874049

以上是关于OAuth2 - 检索令牌时 OPTIONS 请求的状态 401的主要内容,如果未能解决你的问题,请参考以下文章

如何保护来自iframe的Oauth2隐式流

未经授权的 OPTIONS 请求

防止在 asp.net 5 (vNext) 中对预检 OPTIONS 请求进行基于令牌的授权

oauth2.0 尝试使用刷新令牌时请求无效

无法检索 oauth2 的访问令牌

Spring oauth2,使用访问令牌检索用户数据?