建立自訂帳戶類型

到目前為止,我們已討論過如何存取 Google API,這些 API 會使用 Google 定義的帳戶和使用者。但是,如果您擁有自己的線上服務,則不會有 Google 帳戶或使用者,您該怎麼做?因為在使用者的裝置上 安裝新帳戶類型相對簡單明瞭。本課程將說明如何建立與內建帳戶相同的自訂帳戶類型。

導入自訂帳戶程式碼

首先,您必須透過取得使用者憑證的方式。這可以像要求輸入名稱和密碼的對話方塊一樣簡單。也可能是較為特殊的程序,例如動態密碼或生物特徵辨識掃描。無論採用哪一種方式,您都有責任實作程式碼以達到下列目標:

  1. 收集使用者的憑證
  2. 向伺服器驗證憑證
  3. 將憑證儲存在裝置上

一般來說,上述三項要求皆可由單一活動處理。我們將這個活動稱為驗證器活動

由於驗證者需要與 AccountManager 系統互動,因此驗證器活動有某些要求,一般活動無法滿足這些要求。為了輕鬆找出正確資訊,Android 架構提供基礎類別 AccountAuthenticatorActivity,您可以擴充這個類別,建立自己的自訂驗證器。

完全由您決定如何滿足驗證器活動的前兩項需求條件,包括收集和驗證憑證。(如果只有一個方法,就不需要「自訂」帳戶類型)。第三個規定是標準 (更簡單的實作) 實作:

Kotlin

Account(username, your_account_type).also { account ->
    accountManager.addAccountExplicitly(account, password, null)
}

Java

final Account account = new Account(username, your_account_type);
accountManager.addAccountExplicitly(account, password, null);

謹慎考慮安全性!

請務必瞭解 AccountManager 並非加密服務或金鑰鏈。就像您傳遞帳戶憑證一樣,它會以純文字格式儲存帳戶憑證。在大多數裝置上,這不會特別重要,因為這會存放在只能由 Root 權限存取的資料庫中。但在已解鎖裝置上,具有 adb 存取權的任何人都可以讀取憑證。

請記住,您不應將使用者的實際密碼傳送至 AccountManager.addAccountExplicitly()。相反地,您應該儲存經加密編譯且只有攻擊者能使用的加密權杖。如果使用者憑證保護有價值的項目,您應審慎考慮執行類似的操作。

注意:輸入安全碼時,請遵守「迷思路人」原則:切勿在家中試用這個函式!在導入任何自訂帳戶程式碼前,請先諮詢安全專業人員。

既然安全性免責事項已經停用,該是時候回歸工作了。 您已實作自訂帳戶程式碼的肉品,剩下的部分是程式碼。

擴充抽象帳戶驗證器

為了讓 AccountManager 能夠與您的自訂帳戶程式碼搭配使用,您需要有實作 AccountManager 預期介面的類別。此類別是驗證器類別

如要建立驗證器類別,最簡單的方法是擴充 AbstractAccountAuthenticator,並實作其抽象方法。如果您已看過先前的課程,AbstractAccountAuthenticator 的抽象方法應該很熟悉:與您在先前課程呼叫的方法相反,以取得帳戶資訊和授權權杖。

正確實作驗證器類別需要一些獨立的程式碼。首先,AbstractAccountAuthenticator 有七個必須覆寫的抽象方法。接著,您必須在應用程式資訊清單中新增 "android.accounts.AccountAuthenticator"意圖篩選器 (如下一節所示)。最後,您必須提供兩項 XML 資源,定義自訂帳戶類型的名稱,以及系統在這類帳戶旁邊顯示的圖示。

您可以在 AbstractAccountAuthenticator 說明文件中參閱逐步指南,瞭解如何實作成功的驗證器類別和 XML 檔案。

如果驗證器活動需要任何特殊的初始化參數,您可以使用 Intent.putExtra() 將這些參數附加至意圖。

建立驗證器服務

現在,您已擁有驗證器類別,需要讓其上線。帳戶驗證器必須可供多個應用程式使用,並在背景中運作,因此自然需要在 Service 中執行。我們將稱之為驗證器服務

驗證器服務非常簡單。你只需在 onCreate() 中建立驗證器類別的執行個體,然後在 onBind() 中呼叫 getIBinder() 即可。

別忘了在資訊清單檔案中加入 <service> 標記,並新增 AccountAuthenticator 意圖的意圖篩選器,並宣告帳戶驗證器:

<service ...>
   <intent-filter>
      <action android:name="android.accounts.AccountAuthenticator" />
   </intent-filter>
   <meta-data android:name="android.accounts.AccountAuthenticator"
             android:resource="@xml/authenticator" />
</service>

發布服務

大功告成!系統現在可辨識您的帳戶類型,以及所有大名稱帳戶類型,例如「Google」和「公司」。您可以透過「帳戶與同步處理」設定頁面新增帳戶,而要求自訂類型帳戶的應用程式也能進行列舉和驗證,就像使用任何其他帳戶類型一樣。

當然,執行上述操作時,都是假設您已確實在裝置上安裝帳戶服務。如果只有一個應用程式可以存取該服務,那就不是件大事,只需在應用程式中隨附該服務即可。不過,如果您想讓多個應用程式使用帳戶服務,情況會更加輕鬆。您不希望將服務與所有應用程式組合在一起,且不希望讓多個應用程式重複佔用使用者裝置空間。

其中一種解決方法,是將服務放入一個特殊用途的小型 APK。當應用程式想要使用您的自訂帳戶類型時,可以檢查裝置,確認是否可使用您的自訂帳戶服務。如果沒有,應用程式可以引導使用者前往 Google Play 下載服務。乍看之下似乎是個大問題,但相較於重新輸入每個使用自訂帳戶的應用程式,這個簡單的做法很容易更新。