2011-04-22 67 views
8

我的任務是設計一個系統,使我們的用戶也可以登錄他們的賬戶並使用他們的手機與我們的服務進行交互。雖然我擔心應用程序的安全性。移動到服務器API安全

基本上,我們允許用戶使用Facebook或Twitter通過OAuth登錄。移動應用程序(使用Appcelerator鈦製造)也應該這樣做。在電話上成功登錄後,我需要通知我的應用程序有人用FB或Twitter登錄,以便我的應用程序可以檢索用戶的特定於應用程序的用戶標識。

我的第一個想法是編寫一個手機可以調出的API,以便接受諸如Facebook或Twitter userId之類的參數。我會查詢我的數據庫,並找到他們的內部用戶ID並將其返回給手機。

這將工作正常,但它完全不安全。任何人都可以使用Facebook用戶標識訪問相同的API,並且API只會返回內部標識(以及應用程序需要的任何其他數據),而不知道請求是否經過授權。

這是我的第一個移動應用程序,所以我有點不確定在我的API上實現安全性的正確方法。

+0

如何你有沒有解決它?我有完全相似的用例 – daydreamer 2014-07-13 20:08:34

回答

-6

大多數API設置都包含開發人員特有的某種類型的secretKey或APIKey。由於您是唯一的開發人員,您只需在您的移動應用程序中設置密鑰/散列即可通過,以便成功返回數據。

http://lcsd05.cs.tamu.edu/slides/keynote.pdf是Google給出的關於從頭開始設計好API的主題演講。

還檢查了該previous question

+0

謝謝,但這沒有多大幫助,而且問題不在於良好的API設計。我擔心的是,沒有辦法*知道誰在向我的API提交請求。這款手機將以一些請求參數擊中API,但黑客可以輕鬆地手動構建類似的請求。我怎麼能阻止呢? – 2011-04-22 20:09:31

+2

密鑰只有在您不分發密鑰時纔有效。我無法在客戶端設備上放置密鑰,因爲任何人都可以反編譯應用程序或嗅探流量以暴露密鑰。那麼它不再是一個祕密。 – 2011-04-22 20:17:07

+1

@ bh88:應用程序需要提交給服務器的任何信息都可以反編譯,所以無論應用程序可以執行什麼操作,都可以複製 – user102008 2011-09-22 02:23:01

2
  1. 如果可以,使用https,和許多亟待解決的問題。
  2. 時成功登錄,您可以創建一個會話,通過會話ID給客戶端,在這裏我建議你 發送帶有RSA方式的SessionID(爲的情況下,有人可以嗅探你的SessionID)
  3. 使用哈希簽名,以確保該方法不會修改該請求,但該方法無法阻止重新發布問題。

最後,對於您的問題,如果有新的進展,請讓我知道,謝謝!

2

我也遇到過這個問題,認證用戶很簡單,但認證設備要困難得多。就像您所說的,任何人都可以連接到您的API並展示通過Facebook進行身份驗證的用戶並訪問您的API。

您可以使用相互SSL身份驗證來處理它,但如果密鑰在任何單個移動設備上受到威脅,則整個API都會受到影響,因爲所有設備在安裝時都會使用與該應用程序一起使用的相同密鑰對。

我最終做了什麼就是強制設備註冊自己與我的API時,該應用程序第一次安裝。該設備向我的服務器發出一個API調用,併發佈一個API密鑰,然後它必須使用它來進行所有其他API調用。這是不安全的,因爲您可以編寫腳本來註冊自己並獲取API密鑰,但它確實允許我監視API usuage並關閉表現不佳的設備。

這是我能想到的最好的一種方法,可以鎖定我在帶外識別的未經授權的設備。

0

我有同樣的問題,我通過與代理服務器(NodeJS)結合創建我自己的API(PHP)來解決它。我的客戶端的每個請求都發送到代理服務器,代理服務器驗證請求並將其傳遞給我的API。 API只允許來自代理服務器的他的IP請求。

首先用戶使用授權標頭對代理服務器進行身份驗證,如果用戶成功獲得2個標記。訪問令牌和刷新令牌。在我的情況下,訪問令牌用於發出請求並持續5分鐘。當訪問令牌過期時,用戶可以使用永久存在的刷新令牌刷新令牌。

在您的應用程序中創建一個全局模塊,它處理您的鍵邏輯,將您的鍵存儲在本地屬性中,並在用戶重新啓動應用程序時使用它們,以便它們不必每次都重新登錄。

如果將此與HTTPS一起使用,則無法嗅探密鑰,如果您反編譯應用程序,則無法檢索密鑰,因爲它們存儲在用戶設備上,而不是應用程序本身的「硬編碼」。從技術上講,如果攻擊者擁有用戶的設備,他可以反編譯應用程序並檢索密鑰。我知道這一點,但如果他已經訪問了物理設備,他將能夠使用任何應用程序。

代理服務器還記錄每個傳入的請求,並通過電子郵件通知我何時有人正在嘗試技巧(我自己創建了這個)。我用以下幾個模塊:

  • 表達
  • HTTPS
  • HTTP代理(代理請求我的API)
  • jsonwebtoken(生成和驗證訪問/刷新令牌)