2012-08-29 59 views
11

好的。我開始爲我們的企業Web應用程序開發Android應用程序。剛剛開始登錄屏幕活動設計。Android登錄設計和開發 - 方法和最佳實踐

此應用程序完全由RESTFul API驅動。

我想了解如何開發登錄/註銷功能在應用程序。 據我所知,應用程序領域沒有Session概念。另外,對於API,我們需要發送每個請求的用戶名和密碼(基本身份驗證)。顯然,我們需要將登錄憑證保存在本地存儲的某個位置,以便隨每個請求一起發送。

以下是我從我的基本的Android知識理解。

當用戶輸入登錄信息,並按下按鈕,我們將旋轉了一個HTTP調用API。如果登錄憑證有效,那麼我們必須在本地存儲憑證。選項有

  1. SQLite的
  2. 共享偏好。 (我從來沒有使用過,但我猜想,我們可以用這個)
  3. 包(不知道這是一個選項)

任何其他的選擇嗎?

我想確保我遵循最佳實踐,而不是從性能和結構的角度犧牲。

而對於註銷,我想我只需要消滅本地存儲的證書,並顯示登錄活動。

有沒有什麼不同的更好的方法?

回答

13

我會建議使用Android Accounts功能。

This blog有一個很好的一步一步指導您需要放在一起的所有位。

總體思路是提供AccountManager用戶名/密碼,並將其留給AccountManager以安全存儲。

當您需要身份驗證令牌時,您需要向AccountManager請求一個身份驗證令牌,它會返回一個緩存的令牌,或者回撥您的代碼(傳遞用戶名/密碼),並將您的驗證服務調用爲得到一個新的令牌。

+0

我對第3段感到困惑。當您將數據存儲在帳戶中時,它是否會在某個時間過期?這意味着,如果用戶處於應用程序中間,在某個活動中,如果帳戶不給我U/P,我需要顯示登錄屏幕以再次獲取U/P? –

+0

@KevinRave他正在考慮從首選項中重用訪問令牌 –

+0

用戶名/密碼不會過期。從web服務返回的身份驗證令牌可能會過期(在服務器端),如果發生這種情況,您需要通知AccountManager該令牌已過期,並且會觸發回叫,指示您獲得新的令牌 – Rob

2

一般來說,有三種方法可以在Android的持續數據:SQLite的,SharedPreferences和讀取/寫入到文件中,一拉的Java I/O。 SQLite是關係數據的最佳選擇,但是因爲您只需存儲用戶的憑據,所以我建議您使用SharedPreferences。在我看來,就像一個簡單的鍵值數據模型。

SharedPreferences基本上只是直接文件I/O的封裝 - 也就是說,底層實現仍然是文件讀取和寫入,但是對於鍵值對來說是簡化的。我對加密知之甚少,但在將密碼存儲到對象之前,您可能必須自己處理該密碼(也可以考慮JaiSoni的建議:改爲使用訪問令牌)。但請放心,如果您創建了SharedPreferences並將其設置爲MODE_PRIVATE,則其他應用程序將無權訪問共享的prefs文件。

我相信這幾乎是一個標準的實現。如果你看看這個頁面,你可以做的只有很多:http://developer.android.com/guide/topics/data/data-storage.html

我還可以指出,直接文件I/O的複雜性之一是你必須決定你想存儲在哪裏文件 - 內部或外部存儲器(例如SD卡) - 因此檢查其可用性(並非所有設備都有SD卡插槽,有時內部存儲器被註冊爲設備的外部存儲器)。所以,只要去共享首選項。

對於註銷,這可能是有用的:Deleting shared preferences

+0

謝謝。我想知道,如果這是一個標準的做法。或者有更好的方法來做到這一點。關於註銷? –

+0

@KevinRave請參閱編輯。 –

2

我認爲存儲應用程序密碼是糟糕的想法,更好的辦法是隻在第一次做出與用戶證書請求時,獲得用戶登錄服務器返回一個訪問令牌在SharedPreferences中保存此訪問令牌的其他目的,如獲取用戶詳細信息在請求中使用該令牌。
會議:爲維護會話創建自己的班級。 Hackbook就是一個很好的例子。

+0

很棒的建議。這將需要他們修改後端,但是,我是對的嗎?如果訪問令牌機制還沒有實現,那就是。 –

+0

@mattquiros是的,您將需要支持訪問令牌的Web服務 –

+0

@mattquiros您是對的。這是後端業務邏輯的變化。目前尚無法做到這一點。 –

0

爲什麼您需要將登錄憑證保存在文件或數據庫中?你想在你的應用程序重新啓動後自動登錄?如果持久性不是必要的,你可以把憑證放到一個靜態java成員中。

+0

在整個用戶會話中是否可以跨應用程序訪問? –

+0

不確定在運行期間如何爲靜態成員分配用戶名和密碼? –

+0

如果您公開它,它是可訪問的。有關詳細信息,請參見[教程瞭解實例和類成員](http://docs.oracle.com/javase/tutorial /java/javaOO/classvars.html) – k3b