2017-06-14 97 views
0

安全的,我發展通過固定的OAuth2和春天有個REST API將從一個Android應用程序(客戶端)使用。爲了訪問我的API的任何端點,需要的OAuth2訪問令牌,並通過認證頭在一個類似的方式移交給端點:OAuth2用戶端編號和祕密

「授權」 - 「承載accesstokenhere」

爲了獲取接入令牌,用戶名和密碼必須提供,以及作爲客戶端ID和客戶端密鑰(它們所代表的Android應用)。 ClientID的和客戶端祕密都交給的方式通過認證頭令牌端點與此類似,它是由Spring規定:

「授權」 - 「基本的clientId:clientSecret」

如果客戶端ID和客戶端密鑰匹配服務器上定義的客戶端,並且用戶存在並且密碼正確,則返回訪問令牌和刷新令牌。

現在我的問題是我如何安全地將我的clientId和客戶端機密存儲在Android應用程序中,確保有人逆向工程我的應用程序無法訪問它們?

另外,如果我是開發iOS應用程序(第二個客戶端),這將是明智的使用從安全POV不同的clientID的和客戶端祕密?

+0

您的客戶端是一個公共客戶端,無需客戶端密鑰,因爲你不能隱藏祕密。另見:https://stackoverflow.com/a/43391526/5277820和https://stackoverflow.com/questions/44044528/how-to-secure-oauth-2-0-client -id和客戶端祕密。 – dur

回答

2

你不能 - 即使有辦法,我可能還只是檢查電線上的有效載荷來確定的值。請參閱靜態列爲分發給多個用戶不應該被視爲機密的祕密的應用程序的一部分OAuth 2.0 for Native Apps

祕密的8.5節,作爲一個用戶可以檢查他們的複製和學習共享的祕密。出於這個原因,和那些在[RFC6819]的5.3.1節中所說的那樣,不建議授權服務器使用一個共享的祕密,要求公職本機應用程序的客戶端的客戶端身份驗證,因爲這超出了服務的客戶身份沒有什麼價值是
已經由「client_id」請求參數提供。

您的客戶端ID /祕密參數只是提供了發出請求的應用程序的身份,因此建議您希望爲iOS應用程序創建一個不同的客戶端,無論是從安全隔離的角度+對於你想要收集的關於你的應用程序使用情況的任何分析(例如,「你嘗試通過客戶端ID檢索多少登錄?」等)

但是,威脅演員可能會逆向工程設置你的客戶端ID +祕密,然後開始使用用戶名/密碼組合敲擊您的令牌終端,試圖強制您的應用程序。如果端點接受這些值並返回成功/失敗代碼,那麼對於試圖破壞系統的人來說,這是一個有用的攻擊向量。

目前推薦的方法是使用「授權代碼流」

在本地應用授權用戶的最佳目前的做法是 執行在外部用戶代理的OAuth授權請求(典型地瀏覽器),而不是嵌入式用戶代理(例如用web-views實現的代理)。

以前,原生應用程序通常會使用嵌入式 用戶代理(通常使用Web視圖實現)以獲取授權請求。該方法有許多缺點,包括主機應用程序能夠複製用戶憑證和 Cookie,以及需要在每個 應用程序中從頭開始進行身份驗證的用戶。參見第8.12節使用嵌入式 用戶代理進行的OAuth的更深入的分析。」

AppAuth for Android更多信息,看一看,

相關問題