2011-05-31 53 views
69

時保持客戶端憑據保密我們正在構建休息服務,並且我們希望使用OAuth 2進行授權。 current draft(5月19日的v2-16)描述了four grant types。它們是獲得授權的機制或流程(訪問令牌)。如何在使用OAuth2的資源所有者密碼憑證授予類型

  1. 授權碼
  2. 隱格蘭特
  3. 資源所有者憑證
  4. 客戶端憑證

看來,我們需要支持他們四個,因爲他們的目的不同。前兩個(也可能是最後一個)可用於需要訪問該API的第三方應用程序。授權代碼是授權足以幸運地駐留在安全服務器上的Web應用程序的標準方式,而隱式授權流程則是客戶端應用程序的選擇,它不能完全保留其憑據的機密性(例如,移動/桌面應用程序,JavaScript客戶端等)。
我們希望自己使用第三種機制,以在移動設備上提供更好的用戶體驗 - 而不是讓用戶訪問Web瀏覽器中的登錄對話框等,用戶只需直接輸入他或她的用戶名和密碼即可應用程序和登錄。 我們還希望使用客戶端憑證授予類型來獲取可用於查看公共數據的訪問令牌,而不與任何用戶關聯。在這種情況下,這不是什麼授權,而是類似於API密鑰的東西,我們只使用該密鑰來訪問已向我們註冊的應用程序,如果需要,我們可以選擇撤銷訪問。

所以我的問題是:

  1. 你覺得我已經明白正確的不同類型的補助金的目的是什麼?
  2. 如何保持您的客戶端憑據保密?在第三種情況和第四種情況下,我們都需要客戶端上的客戶端ID和客戶端密碼,這聽起來不是一個好主意。
  3. 即使您使用隱式授權類型並且不公開您的客戶端密鑰,是什麼阻止另一個應用程序使用相同的授權機制和客戶端ID來模擬您的應用程序?

總而言之,我們希望能夠使用來自客戶端應用程序的客戶端憑證和資源所有者憑據流。這兩種流程都需要您以某種方式存儲客戶端密鑰,但客戶端是移動設備或JavaScript應用程序,因此很容易被盜取。

回答

53

我面臨着類似的問題,而且對OAuth也相對陌生。我們在我們的API中實施了「資源所有者密碼憑據」,以供我們的官方移動應用程序使用 - 網絡流量看起來像在移動平臺上使用會非常糟糕,並且一旦用戶安裝了應用程序並信任這是我們的官方應用程序,他們應該感覺舒適直接輸入用戶名/密碼到應用程序。

問題是,正如你指出的,我的API服務器無法安全地驗證應用程序的client_id。如果我在應用程序代碼/包中包含client_secret,那麼它會暴露給安裝該應用程序的任何人,因此需要client_secret不會使該過程更安全。所以基本上,任何其他應用程序都可以通過複製client_id來模擬我的應用程序。

只是爲了在每個點的直接回答:

  1. 我不斷重讀規格的不同草案是否有任何的改變,我主要集中於資源所有者密碼憑據部分,但我認爲你對這些是正確的。客戶端憑證(4)我認爲也可以被內部或第三方服務使用,這些服務可能需要訪問的不僅僅是「公共」信息,例如您可能有分析或需要跨所有用戶獲取信息的內容。

  2. 我不認爲你可以保留客戶端上的任何保密信息。

  3. 沒有什麼能阻止其他人使用您的客戶端ID。這也是我的問題。一旦你的代碼離開服務器,並作爲一個應用程序安裝或在瀏覽器中作爲Javascript運行,你不能認爲任何事情都是祕密的。

對於我們的網站,我們遇到了與您使用客戶端證書流程描述的問題類似的問題。我最終做的是將認證移到服務器端。用戶可以使用我們的Web應用程序進行身份驗證,但是API的OAuth令牌存儲在服務器端,並且與用戶的Web會話相關聯。 Javascript代碼所做的所有API請求實際上都是對Web服務器的AJAX調用。因此,瀏覽器不是直接通過API進行身份驗證,而是具有經過身份驗證的Web會話。

看起來您的Client Credentials的用例不同,因爲您在討論第三方應用程序,並且只通過此方法提供公共數據。我認爲你的擔憂是有效的(任何人都可以竊取和使用任何其他人的API密鑰),但是如果你只需要免費註冊來獲得API密鑰,我就不明白爲什麼有人會真的想偷一個。

您可以監控/分析每個API密鑰的使用情況,以嘗試檢測濫用情況,此時您可以使一個API密鑰無效併爲合法用戶提供一個新密鑰。這可能是最好的選擇,但它絕對不安全。

如果你想鎖定它更緊一點,你也可以使用Refresh Token-like方案,儘管我不知道你會獲得多少收益。如果您每天一次過期使用Javascript暴露的api令牌,並要求第三方使用(祕密)刷新令牌進行某種服務器端刷新,那麼被盜的api令牌永遠不會超過一天。可能鼓勵潛在的令牌盜賊只是註冊。但對其他人來說,這是一種痛苦,所以不確定這是否值得。

+2

我已經做了更多的研究,我認爲你是對的 - 沒有辦法在客戶端保持任何祕密。看起來,正如您所建議的那樣,我們保護API免遭濫用的最佳選擇是實施某種使用情況監控。感謝您的回答! – 2011-06-06 08:48:04

+0

如果您將來遇到任何更好的解決方案,請告訴我! – heavi5ide 2011-06-06 16:00:23

+2

只是爲了解,下面的說法正確嗎? *當您使用經過身份驗證的Web會話(通過cookie等)並在服務器上以「舊方式」進行身份驗證時,使用OAuth2的資源所有者密碼憑證授予類型時沒有更多的安全性,因爲經典的Web會話/ cookie可能會傳遞給其他演員/可能被盜。 – spaudanjo 2014-08-29 07:59:58

相關問題