2011-12-05 22 views
3

我們目前正在實施OAuth2以保護我們的新API並且不確定如何安全地提供所需的功能。我們需要允許從移動設備如下:使用OAuth2安全驗證移動訪問的選項

下載應用的用戶能夠拍攝照片,並提交它,而無需首先登錄後立即

雖然我們希望允許匿名用戶訪問,在用戶不需要登錄或註冊以使用某些功能的情況下,我們不希望允許對API進行未經驗證的訪問。這通常可以使用client credentials authorization flow來獲取和應用訪問令牌來實現,但這需要了解客戶端的祕密。從我讀到的內容來看,移動設備不被視爲可信客戶端,不應該包含客戶端密鑰,因此不應該能夠自行生成應用訪問令牌。

我們已經想出了幾個選項來完成這一要求,但希望對他們一些輸入:

  1. 嵌入在應用程序客戶端機密。從安全的角度來看,這看起來並不理想,但也許我們錯過了一個明顯的方法來保護它?我們至少針對iOS和Android。
  2. 離線生成應用訪問令牌並將其嵌入到應用中。仍然不是很安全,但至少祕密沒有暴露。
  3. 允許僅使用客戶端ID而不是訪問令牌訪問某些功能。這可能是最簡單的,但它引入了不一致性,需要多種身份驗證客戶端的方式。
  4. 構建並使用伴隨網絡應用爲移動應用生成應用訪問令牌。表面上看起來像是一個勝利者,但現在你必須確保訪問同伴應用程序!

如何安全地從移動設備使用OAuth2驗證對API的訪問權限,而無需用戶先登錄?

+0

究竟是你想爲 「安全」 是什麼?您並未嘗試對用戶進行身份驗證,因爲您聲明瞭匿名訪問。您是否想要認證客戶端應用程序?嘗試通過加密連接進行通信? 「安全」有點模糊。 – Fantius

+0

也許'安全'不是最好的術語。我們不想要的是匿名訪問API - 我們想知道哪個應用正在發出請求。我們需要的是允許應用程序發出請求,而無需用戶登錄。我將更新問題以嘗試澄清。 –

+0

然後,應用程序需要有一些祕密,沒有別的。這是做到這一點的唯一方法。如果有什麼祕密,它可以模擬應用程序。 – Fantius

回答

2

同意在問:無論是評論:

1)使用客戶端憑證中的OAuth 2批類型 - 在你的應用程序嵌入的祕密。瞭解這不是超級安全的,有人會最終逆向工程。理想情況下,每個客戶都會得到一個獨特的祕密 - 所以如果他們濫用其用途,您可以撤銷客戶。

2.)使用該API開放 - 因此根本不需要OAuth 2訪問令牌。也許這個API只會被你的應用知道 - 但是再一次,有人反向工程師只是時間問題。

+0

似乎嵌入應用程序訪問令牌比嵌入應用程序祕密略好一點?沒有任何身份驗證就將API保持打開不是一種選擇。我們需要知道誰在使用API​​。 –

+0

訪問令牌通常是短暫的(基於時間)。您認爲在用戶安裝X之後/在他們正確登錄之前,僅允許此API用於X分鐘/小時?如果沒有 - 那麼你可能意味着一個「刷新令牌」 - 這是更長的壽命(通常用戶被撤銷),並可以交換訪問令牌。如果我是你 - 如果可以的話 - 嘗試在你的應用中嵌入獨特的client_id/client_secret,並且只允許這些客戶端調用這個特定的API(即:其OAuth範圍只允許這個操作)。確保你有辦法監控濫用/撤銷這些客戶端服務器端。 –

+0

儘管支持HTTPS的檢查員能夠即時顯示客戶端ID和密碼,但我們最終選擇了第1種方式。如果祕密絕對必須保密OAuth 2不是要走的路。 –

2

我的小組正在進行類似的討論。用戶可以獲取應用程序並瀏覽目錄,而無需登錄。目錄和其他數據是通過API訪問的,我們希望強制用戶爲所有呼叫設置access_token。

我們目前的想法是

  • 總是強制應用到一個交換的access_token一個共同的clientId /祕密。所以即使是匿名用戶,該應用也會獲得access_token。這將通過client_credentials oAuth流。
  • 如果用戶登錄,請使用oAuth密碼流。他們會通過clientId,祕密,用戶名和密碼。我們還允許他們傳遞他們的匿名標記,以便我們可以從他們的匿名會話中傳輸任何歷史記錄。

因此,例如...

access_token = api.oAuth.client_credentials(clientId, secret) 
catalog = api.getCatalog(access_token) 
authenticated_access_token = api.oAuth.password(clientId, secret, username, password, access_token)