3

我們的堆棧使用Backbone作爲我們的客戶端應用程序,Spring Boot作爲RESTful API。OAuth2 - 檢索TOKEN時OPTIONS請求上的狀態401

我們正在嘗試使用OAuth2進行基本身份驗證,並提供用戶名和密碼。

我們使用Spring Security進行身份驗證,並使用jQuery $ .ajax方法進行請求。然而,我們得到的響應是在預檢OPTIONS請求時的401(未授權)狀態,然後我們甚至可以將POST標題與我們的祕密進行授權。 但是,我們可以POST或GET任何其他資源沒有任何問題。 OPTIONS請求的服務器響應是200(ok),然後它跟隨POST請求。

那麼,爲什麼從/ oauth /令牌響應的選項請求與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 
    } 

[...] 
} 

回答

2

我可以回答你的問題在理論:

那麼,爲什麼這是一個來自/ oauth/token響應的OPTIONS請求,即使它不應該有401狀態?它不會讓我們授權我們自己,因爲它卡在OPTIONS請求中,我們無法添加授權標頭。

這是因爲default configuration of the AuthServer只允許在令牌端點完全驗證的請求。

在您的資源服務器上,你允許所有的請求無需驗證的發生是這樣的:

我試圖解決這種情況就像提到here,但我無法得到那個爲我工作。

爲了完整起見,我在這裏還要提到,您必須添加一個CorsFilter以將正確的標題添加到OPTIONS預檢請求中。

I also asked a very similar question,所以也許如果我的答案,你能夠解決你的問題以及這些信息。

+1

解決了我的問題,這也應該適合你!結帳我的CorsFilter:http://stackoverflow.com/a/30638914/1874049 –

相關問題