簡體   English   中英

如何在使用 OAuth2 的資源所有者密碼憑據授予類型時對客戶端憑據保密

[英]How to keep the client credentials confidential, while using OAuth2's Resource Owner Password Credentials grant type

我們正在構建 rest 服務,我們希望使用 OAauth 2 進行授權。 當前的草案(5 月 19 日的 v2-16)描述了四種資助類型 它們是獲取授權(訪問令牌)的機制或流程。

  1. 授權碼
  2. 隱式授權
  3. 資源所有者憑證
  4. 客戶憑證

看來我們需要支持所有四個,因為它們服務於不同的目的。 前兩個(也可能是最后一個)可以從需要訪問 API 的第三方應用程序中使用。 授權代碼是授權 web 應用程序的標准方法,該應用程序幸運地駐留在安全服務器上,而隱式授權流將是不能完全保密其憑據的客戶端應用程序的選擇(例如移動/桌面應用程序,JavaScript 客戶端等)。
我們希望自己使用第三種機制來在移動設備上提供更好的用戶體驗——而不是將用戶帶到 web 瀏覽器等中的登錄對話框,用戶只需直接在應用程序中輸入他或她的用戶名和密碼並登錄。 我們還想使用 Client Credentials 授權類型來獲取可用於查看公共數據的訪問令牌,不與任何用戶關聯。 在這種情況下,這不是太多的授權,而是類似於 API 密鑰的東西,我們使用該密鑰僅授予已向我們注冊的應用程序的訪問權限,從而使我們可以在需要時撤銷訪問權限。

所以我的問題是:

  1. 您認為我正確理解了不同資助類型的目的嗎?
  2. 您如何對客戶憑證保密? 在第三種和第四種情況下,我們都需要在客戶端的某個地方擁有客戶端 ID 和客戶端密碼,這聽起來不是一個好主意。
  3. 即使您使用隱式授權類型並且不公開您的客戶端密碼,有什么可以阻止另一個應用程序使用相同的授權機制和您的客戶端 ID 來模擬您的應用程序?

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

我面臨着類似的問題,而且對 OAuth 也比較陌生。 我已經在我們的 API 中實現了“資源所有者密碼憑據”,供我們的官方移動應用程序使用——web 流看起來就像它們在移動平台上使用起來太可怕了,一旦用戶安裝了應用程序並信任這是我們的官方應用程序,他們應該覺得直接在應用程序中輸入用戶名/密碼很舒服。

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

只是為了直接回答你的每一點:

  1. 我不斷重新閱讀規范的不同草稿以查看是否有任何更改,並且主要關注資源所有者密碼憑據部分,但我認為您在這些方面是正確的。 Client Credentials(4) 我認為也可以由內部或第三方服務使用,這些服務可能需要訪問的不僅僅是“公共”信息,比如您可能有分析或需要獲取所有用戶信息的東西。

  2. 我認為你不能對客戶保密。

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

對於我們的網站,我們遇到了與您描述的客戶憑證流程類似的問題。 我最終做的是將身份驗證移至服務器端。 The user can authenticate using our web app, but the OAuth token to our API is stored on the server side, and associated with the user's web session. 所有 API 請求 Javascript 代碼實際上都是對 Z2567A5EC9705EB7AC2C984033E06 服務器的 AJAX 調用。 所以瀏覽器沒有直接使用 API 進行身份驗證,而是有一個經過身份驗證的 web session。

您的客戶端憑據的用例似乎有所不同,因為您在談論第三方應用程序,並且僅通過此方法提供公共數據。 我認為您的擔憂是正確的(任何人都可以竊取和使用其他人的 API 密鑰),但如果您只需要免費注冊即可獲得 API 密鑰,我不明白為什么有人真的想偷一個。

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

如果您想將其鎖定得更緊,您也可以為此使用類似 Refresh Token 的方案,盡管我不知道您會真正獲得多少。 如果您每天使 Javascript 公開的 api 令牌過期一次,並要求第三方使用(秘密)刷新令牌進行某種服務器端刷新,那么被盜的 api 令牌將永遠不會超過一天。 可能會鼓勵潛在的令牌竊賊只注冊。 但對其他人來說有點痛苦,所以不確定這是否值得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM