2011-03-17 70 views
3

我想創建一個靈活的API Rest服務器。我將允許客戶端使用HTTP或APIKEY進行身份驗證。REST GET請求,動詞和apikey

我的問題是:什麼是對apikey添加到GET請求的正確方法?我的問題是apikey污染了網址。

我想是這樣的:/電子書/ 1/apikey/s4cr4t!

+0

如果您提及您(計劃)使用的技術,將會有所幫助。 – gideon 2011-03-17 05:10:04

+0

@giddy爲什麼技術很重要? – 2011-03-17 11:09:58

+0

:)只是覺得他可以添加它..因爲他的Q沒有答案,評論幾個小時。 – gideon 2011-03-17 11:49:13

回答

11

在我看來,你應該只使用Authorization頭。這就是它的原因。

把它的URL是一個壞主意,因爲:

一)如你所說它污染的URL
b)如果您決定去SSL安全,則API仍將出現在日誌文件中
c)緩存將最終創建相同表示的多個副本,每個api鍵一個。

有關創建您自己的授權方案的更多信息,請here

+0

對不起我的問題,但是這種方法不會暴露你的API密鑰(使用開發人員工具)? – 2017-08-02 15:01:22

+0

@JoshMonreal它的確如此。但是,在HTTP請求中確實沒有可以完全保護客戶機密的地方。目標是把它放在最不可能成爲問題的地方。理想情況下,API密鑰只能用於未經授權的使用易於檢測並可以翻轉的情況。 – 2017-08-04 13:58:13

4

證書可以使用Authorization標頭中傳遞:

GET http://domain.com:/book/1 
Authorization: apikey="s4cr4t" 
+0

我相信你需要在授權標題中指定一個方案。例如Authorizaton:myapiauthscheme apikey =「s4cr4t」 – 2011-03-17 11:21:37

+0

是的,你實際上需要更多的東西,然後apikey,但這只是另一種方式的例子。 – 2011-03-17 18:27:52

+0

這會怎樣看待'$ http.get()'? – 2016-10-28 15:26:56

2

這一切都取決於你想要走多遠,但是技師保持不變:

語境

的目標是安全的一些級別來識別客戶端。 (注:安全性是另一個詳細的討論)。請記住,如果REST的「功能」是無狀態的,那就意味着:除了資源之外,服務器上沒有會話狀態。爲了保持客戶端無狀態,它需要在每個請求上提供足夠的信息來表明請求是獨立的。它必須爲服務器提供一種識別客戶端的方法,例如用戶名/密碼,API密鑰或令牌。

你有不同的選項來做到這一點的,這裏有:

添加HTTP標頭識別客戶端

在這裏,人們可以使用認證頭,並與每個請求發送。有各種認證方案,但堅持標準的,如Basic Auth。在這裏你可能會堅持使用SSL。如果您願意,身份驗證過程會生成一種令牌。

您還可以使用一個Cookie的。 cookie必須包含任何信息除了它是你的服務器上的「指針或鑰匙」有狀態會話資源(注:會話它的資源,這是「休息法律」)。您可以通過響應200 OK或POST(+ info)執行PUT(+ info)創建此資源,響應爲201 Created和Location:/ sessions/123334。會話然後可以由服務器,如超時,有效的客戶端IP地址,API密鑰等

上述的方法驗證,您還可以定義一個客戶頭如API密鑰:XXXX。但是,你只限於特殊的客戶。 Set-Cookie是「衆所周知的」標題,因此瀏覽器會透明地處理它們。然後可以通過以下鏈接並填寫表單(PUT + POST)進行身份驗證(創建會話資源)來完成身份驗證過程。

編碼的內容

這裏的標識,你可以自由地做你想要什麼了。只需在您的內容中添加一個字段/令牌/標識並讓服務器驗證它。

RESTful API通過解析鏈接來執行應用程序流。另請參閱HATEOASFielding's words。這也適用於您有單獨的登錄應用程序的過程。

不要在URI中編碼任何數據。 (帶外信息)