使用密碼驗證

雖然 Credential Manager 支援以密碼登入,但我們強烈建議優先採用更安全的新式驗證方法,例如密碼金鑰使用 Google 帳戶登入。這些方法可大幅提升安全性及使用者體驗。不過,如果應用程式必須支援密碼,請參考本指南,透過 Credential Manager 實作密碼功能。

Credential Manager 提供統一的 API,供應用程式儲存及擷取使用者憑證,包括使用者名稱和密碼。這可簡化使用者的登入程序,讓他們順暢使用憑證供應商。

必要條件

搭載 Android 4.4 (API 級別 19) 以上版本的裝置,都支援 Credential Manager 的密碼實作方式。

總覽

本指南著重於應用程式中建立、儲存及登入密碼所需的變更。

  • 為應用程式新增依附元件:新增必要的 Credential Manager 程式庫。
  • 例項化 Credential Manager:建立 Credential Manager 例項。
  • 儲存使用者密碼:安全地儲存使用者憑證。
  • 使用密碼登入:擷取並使用儲存的憑證登入。
  • 找出應使用自動填入功能的欄位:使用自動填入功能,提升使用者體驗。
  • 新增 Digital Asset Links 的支援:新增支援,在連結的應用程式和網站之間共用密碼。

為應用程式新增依附元件

在應用程式模組的 build.gradle 檔案中新增下列依附元件:

Kotlin

dependencies {
    implementation("androidx.credentials:credentials:1.7.0-alpha02")
}

Groovy

dependencies {
    implementation "androidx.credentials:credentials:1.7.0-alpha02"
}

例項化 Credential Manager

使用應用程式或活動情境建立 CredentialManager 物件。

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

儲存使用者密碼

當使用者在應用程式中成功註冊或更新密碼時,請將這些憑證儲存在密碼管理工具中。

  1. 建構密碼要求CreatePasswordRequest 物件包含要儲存的使用者名稱和密碼。呼叫 credentialManager.createCredential() 來啟動儲存程序。

  2. 處理回應:處理 CreatePasswordResponse 並管理任何錯誤 (例如使用者取消要求)。

suspend fun registerPassword(username: String, password: String) {
    // Initialize a CreatePasswordRequest object.
    val createPasswordRequest =
        CreatePasswordRequest(id = username, password = password)

    // Create credential and handle result.
    coroutineScope {
        try {
            val result =
                credentialManager.createCredential(
                    // Use an activity based context to avoid undefined
                    // system UI launching behavior.
                    activityContext,
                    createPasswordRequest
                )
            // Handle register password result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}

使用密碼登入

如要擷取已儲存的憑證,請使用 GetPasswordOption 建構 GetCredentialRequest,然後呼叫 getCredential()。如要根據指定的使用者 ID 篩選要擷取的密碼,請使用選用欄位 allowedUserIds

val getPasswordOption = GetPasswordOption()

val credentialRequest = GetCredentialRequest.Builder()
    .addCredentialOption(getPasswordOption)
    .build()

找出應使用自動填入功能的欄位

android:isCredential 屬性可協助憑證供應商識別要自動填入的欄位,進而提供更流暢的使用者體驗。這項屬性可補足現有的 autofillHints

指出特定欄位適用於自動填入功能的好處包括:

  • 提升自動填入準確度:協助密碼管理工具和 Android 系統更準確地識別用於憑證的欄位。
  • 提升使用者體驗:可提供更流暢、更可靠的自動填入建議。

在使用者名稱和密碼欄位中加入 isCredential 屬性,如以下範例所示:

<EditText
    android:id="@+id/username_edittext"
    android:autofillHints="username"
    android:isCredential="true" />

<EditText
    android:id="@+id/password_edittext"
    android:inputType="textPassword"
    android:autofillHints="password"
    android:isCredential="true" />

或者,您也可以透過程式新增屬性,如以下程式碼片段所示:

if (android.os.Build.VERSION.SDK_INT >=
    android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 14
    usernameEditText.isCredential = true
    passwordEditText.isCredential = true
}

如要確保與密碼管理工具相容,您必須在應用程式和網站之間設定 Digital Asset Links。這樣一來,就能在兩個平台之間安全地共用憑證。