2013-01-03 137 views
15

我正試圖理解和實現我們的新REST服務器和現有客戶端應用程序之間的客戶端憑據流。我設置了彈簧安全OAuth2,如this。從我的理解,到目前爲止,我的服務器現在應該支持以下要求:瞭解OAuth2客戶端憑據流

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

,但我得到

InsufficientAuthenticationException: There is no client authentication 

造成Principalnull這裏(彈簧安全碼):

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

所以看來,我需要首先與服務器進行身份驗證。但這不是我想要做的。我想讓我的兩臺服務器使用共享密鑰相互交談。 OAuth提供程序服務器應根據請求向(可信的)客戶端服務器提供訪問令牌,以便客​​戶端服務器可以使用該令牌訪問服務器上的所有REST資源。這應該保護REST資源免受外部訪問。

後來我想向第三方提供選定的資源,並最終爲服務器到服務器的通信實現一些更細粒度的安全性。但現在我需要保護REST服務器免受外部訪問。

看起來好像我可能會對整個客戶端憑證流或彈簧安全應用程序有一些誤解,因此任何澄清都將不勝感激。

回答

18

您未驗證授權服務器的客戶端。

你需要做這樣的事情:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

這是驗證客戶到授權服務器,然後指定grant_type等參數。這將返回一個類型爲「承載者」的訪問令牌,其範圍由oauth客戶端詳細信息確定。一旦擁有令牌,您可以通過設置授權標頭來訪問受保護的資源:

curl -H "Authorization: Bearer <accessToken>" <resourceUrl> 
+0

感謝您的回答。那麼我的思路基本正確嗎?對於客戶端憑證流,我使用客戶端憑證和授予類型請求令牌,然後使用該令牌訪問受保護的資源?我想我只是有一個設置錯誤,因爲使用sparklr示例項目我上面提到的調用確實有效。 – Pete

+0

我認爲你是在正確的軌道上。客戶首先使用特定的授權類型請求令牌。然後,只需在訪問受保護資源時將auth頭中的令牌傳遞給auth頭。我通過訪問資源的示例更新了我的答案。 – kldavis4

相關問題