2011-11-23 223 views
0

的計劃:爲Android應用程序登錄系統

我開發在很大程度上數據庫驅動的Android應用程序(如中,大部分的內容通過一個RESTful服務層是從MySQL數據庫中提取我的網絡服務器)。

在可以對API請求數據進行任何調用之前,用戶必須通過將憑據傳遞給數據庫進行身份驗證來進行身份驗證。如果用戶被驗證,我會傳回授權令牌。如果用戶選擇了「記住我」選項,該令牌將被保存在本地以供將來使用。

所有將來的API調用都需要包含此授權令牌。

當用戶希望註銷時,會將呼叫發送回API以從數據庫中刪除該令牌,從而使其無效以供將來使用。令牌的本地副本也會被刪除。


的問題

如果用戶註銷,並直接關閉應用程序(家庭或後退按鈕),並沒有足夠的「記住我」選項選中,我想銷燬服務器上的令牌。如何才能做到這一點?


可能的解決方案#1

  • 如果有onExit事件觸發應用程序退出時,請對API讓它知道摧毀令牌的呼叫。
  • 用這種方法

的問題是:

  • 請問這種情況存在,這是保證在所有 條件來提高(home鍵,返回鍵,程序崩潰(我能活 沒有這個))?

可能的解決方案#2

  • 維護數據庫中的一個time of last activity列。如果自上次活動後致電x min,該令牌將被視爲過期。

使用這種方法的問題是:在每個API調用更新數據庫中的時間列的

  • 額外開銷。

  • 此外,我現在必須存儲在數據庫中,如果用戶選擇要記住,因爲在那種情況下令牌不能過期。


你會實行這兩種解決方案?還是有另一種更好的方式來實現這種機制?

如果您建議#1,請告訴我哪個事件會符合我的目的。

+0

當用戶沒有選擇「記住我」選項時,爲什麼要在服務器上保存授權令牌?您的授權請求可能包含1)憑證2)「記住我」選項。只有在選擇選項時才記住標記。 – Flavio

+0

我一直在想,一旦我收到了證書並驗證了用戶,發出令牌就不需要每次進行API調用時都要將用戶名和密碼傳遞給服務器,從而使其更安全。令牌將是臨時的,而密碼更持久。此外,擁有令牌可以讓用戶遠程登出任何設備。 (訪問朋友的電話,忘記註銷) – xbonez

回答

1

你的第一個解決方案是不適用的,因爲:

  1. 沒有的OnExit事件。 (當然,如果用戶按Home或Back按鈕只是爲了弄清楚用戶是否隱藏了應用程序,你可以創建基本活動並在那裏監控)但是這非常複雜)
  2. 不要依賴客戶端註銷。如果用戶請求註銷,但當時互聯網不可用,該怎麼辦?
  3. Android可以在低內存的情況下隨時殺死您的應用程序。

您最好實施第二種解決方案。正面:

  1. AFAIK,這是常見的做法,當服務器控制授權令牌
  2. 無需在數據庫中存儲,如果選擇的用戶要記住到期。只需將過期日期設置爲Integer.MAX_VALUE或其他。
1

我認爲這應該由服務器來處理。當您的會話在特定的不活動時間後死亡時,服務器必須是註銷用戶的服務器。我不確定是否有整個應用程序的監聽器,如果它死了,但我從來沒有聽說過。另外,用戶可以始終強制殺死應用程序,而無需通過任務管理器註銷。

+0

我也傾向於這種解決方案。我不認爲維持上次活動時間的開銷應該是顯而易見的,但我會測試並檢查這一點。 – xbonez

+0

是的。我之前做過一個Web服務,並且做了這個解決方案。你可以做的就是將會話設置爲在一段時間不活動之後終止,並創建一個監聽器,在會話消失時監聽它。你並不需要在數據庫上保存最後的交易時間。但這一切都取決於你的網絡服務是有狀態的還是無狀態的。 – Arci