2013-02-05 42 views
5

我已經看到許多關於不同解決方案的不同文章,用於驗證RESTful API,並且在當前情況下我有一些問題。面向REST API身份驗證的客戶端

我已經構建了一個REST API,允許我的軟件服務(我們是B2B公司)的客戶以編程方式訪問資源。現在我已經可以正常使用API​​了,我想以最標準的方式保證它的安全。我需要允許基於API的調用者訪問某些資源。也就是說,並非所有API的用戶都可以訪問所有資源。

我提供網址的格式如下:

https://mydomain/api/students 
https://mydomain/api/students/s123 
https://mydomain/api/students/s123/classes 
https://mydomain/api/students/s123/classes/c456 

到目前爲止,我想出了這些可能的解決方案:

  1. 提供一個唯一的密鑰,以每個客戶,他們可以使用最終生成一個加密標記,該標記將在每個REST調用結束時作爲GET參數傳遞給(重新) - 驗證每個請求。這是方法過於昂貴

    https://mydomain.com/api/students/s123?token=abc123

  2. 所看到here提供的HTTP認證頭的值。這與#1幾乎相同嗎? (除了我無法將URL粘貼到瀏覽器中)人們是否再使用這些標頭?

  3. 使用OAuth 2(我仍然有點不清楚)。 OAuth 2是否實際將客戶端認證爲登錄用戶?這不符合REST API無國界的精神嗎?我希望OAuth對我來說是合適的解決方案(因爲它是一個公共標準),但在閱讀了一點之後,我不太確定。對於REST API調用它是否過度和/或不適當?

我的目標是提供不必更改爲希望來使用API​​的每個客戶端的API,而是我可以提供提供給所有客戶的標準文檔。

如果我不清楚,我很樂意發佈更多詳細信息。

回答

1

有2個類型的客戶,你可能要準備API:

  • 信任的客戶 - 這是由你而寫的。他們可以擁有實際用戶的用戶名和密碼,並且可以使用每個請求將該數據發送到服務器,可能位於HTTP身份驗證標頭中。所有你需要的是他們加密的連接。

  • 第三方客戶端 - 哪些是由一些隨機開發者編寫的。您可以在服務中註冊它們,併爲其中的每一個添加一個唯一的API密鑰。之後,如果用戶想要使用他們的服務,則必須向她顯示提示,讓她可以訪問第三方客戶端。之後,第三方客戶端將被賦予具有給定權限的用戶帳戶,並且將獲得用戶特定的訪問令牌。因此,當客戶端將API密鑰和用戶特定的令牌與請求一起發送時,它會以用戶的名義發送請求。

OAuth可以幫助您控制第二種情況。

您的網址對客戶沒有意義。通過REST,您必須通過發送帶有語義註釋的鏈接(例如鏈接關係)來將客戶端與URL結構分離。因此,您的文檔不必包含有關URL結構的任何內容(也許它可以用於服務器端調試,但僅此而已)。你必須談論不同類型的鏈接。通過在服務器端生成這些鏈接,您可以檢查實際用戶(或第三方客戶端)的權限並跳過她無權關注的鏈接。