2011-10-18 130 views
111

我想知道是否可以將自定義數據放入HTTP授權標頭。我們正在設計一個RESTful API,我們可能需要一種方法來指定一個自定義的授權方法。作爲一個例子,我們稱之爲FIRE-TOKEN認證。自定義HTTP授權標頭

會像依據規範這是有效的,並允許:Authorization: FIRE-TOKEN 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

第二串的第一部分(前「:」)是API密鑰,第二部分是查詢字符串的哈希。

回答

22

將它放在一個單獨的自定義標題中。

重載標準的HTTP標頭可能會導致更多的混亂,而且會違反principle of least surprise。它也可能導致API客戶端程序員的互操作性問題,他們希望使用現成的工具包,這些工具包只能處理典型HTTP標頭的標準格式(如Authorization)。

+2

這可能是很難得到正確的比看起來。 fumanchu提供的鏈接(在他的回答的評論中)解釋了爲什麼引入自定義標頭增加了現在必須正確手動設置緩存控制的額外負擔。 –

+3

另外,如果您通過瀏覽器提出交叉來源請求,則您現在正處於飛行前區域,只是因爲自定義標題可能會避免它。對於某些應用程序,這些請求會加起來。 –

+17

巨大的否自定義身份驗證標頭。具有您自己的自定義方案的spec-standard「授權」標題應該足夠了。此外,您避免了@wilmoore指示的預先發送來源請求。自定義方案不會干擾任何我知道的合理的現代HTTP服務器,如果您使用自己的方案,則必須自己解析它 - 任何庫都不應該發生衝突(否則庫不好寫)。 –

15

不,根據RFC 2617中的「憑證」定義,這不是有效的生產。你給出了一個有效的認證方案,但認證參數的值必須是token "=" (token | quoted-string)的形式(參見1.2節),而你的例子並不使用「=」那種方式。

+0

這是不正確的。有關示例格式,請參閱文檔的第5頁:授權:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ == – NRaf

+10

的確如此。但正如http://tools.ietf.org/html/draft-ietf.org/html/draft-ietf-httpbis-p7-auth-16#section-2.3.1所說,「爲了與現有認證方案兼容,引入了」b64token「符號,並且只能每個挑戰/憑證使用一次,因此新方案應該使用「auth-param」語法,否則將來的擴展將不可能實現。「另請參閱有關在自定義標頭中執行身份驗證的緩存討論。 – fumanchu

115

RFC2617中定義的格式是credentials = auth-scheme #auth-param。所以,在與fumanchu同意,我覺得校正授權方案會是什麼樣子

Authorization: FIRE-TOKEN apikey="0PN5J17HBGZHT7JJ3X82", hash="frJIUN8DYpKDtOLCwo//yllqDzg=" 

哪裏FIRE-TOKEN是方案和兩個鍵值對是AUTH參數。雖然我相信引號是可選的(從P7-AUTH-19 Apendix B)...

auth-param = token BWS "=" BWS (token/quoted-string) 

我相信這符合最新的標準,已在使用中(見下文),並提供了一個密鑰 - 用於簡單擴展的值格式(如果您需要其他參數)。

這個AUTH-PARAM語法的一些例子可以在這裏看到...

http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-19#section-4.4

https://developers.google.com/youtube/2.0/developers_guide_protocol_clientlogin

https://developers.google.com/accounts/docs/AuthSub#WorkingAuthSub

+2

[亞馬遜的簡單存儲API](http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)提供了另一個例子。 – bishop

8

老問題,我知道,但對於好奇:

相信與否,這個問題是在20幾年前用HTTP BASIC解決的,它通過了s作爲base64編碼的用戶名:密碼的值。 (見http://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

你可以做同樣的,這樣上面的例子就變成:

Authorization: FIRE-TOKEN MFBONUoxN0hCR1pIVDdKSjNYODI6ZnJKSVVOOERZcEtEdE9MQ3dvLy95bGxxRHpnPQ== 
+1

我會建議不要這個答案,因爲,[根據另一個答案在這裏的評論](https://stackoverflow.com/questions/7802116/custom-http-authorization-header#comment9522460_7809486),這裏使用的符號是爲了兼容性與現有的方案,不建議用於新的擴展。 – Whymarrh