我正試圖理解和實現我們的新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
造成Principal
是null
這裏(彈簧安全碼):
@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服務器免受外部訪問。
看起來好像我可能會對整個客戶端憑證流或彈簧安全應用程序有一些誤解,因此任何澄清都將不勝感激。
感謝您的回答。那麼我的思路基本正確嗎?對於客戶端憑證流,我使用客戶端憑證和授予類型請求令牌,然後使用該令牌訪問受保護的資源?我想我只是有一個設置錯誤,因爲使用sparklr示例項目我上面提到的調用確實有效。 – Pete
我認爲你是在正確的軌道上。客戶首先使用特定的授權類型請求令牌。然後,只需在訪問受保護資源時將auth頭中的令牌傳遞給auth頭。我通過訪問資源的示例更新了我的答案。 – kldavis4