使用密码进行身份验证

虽然 Credential Manager 支持基于密码的登录,但我们强烈建议优先考虑更安全的新型身份验证方法,例如通行密钥使用 Google 账号登录。这些方法可显著提升安全性和用户体验。不过,如果您的应用必须支持密码,请参考本指南,了解如何使用 Credential Manager 实现密码功能。

Credential Manager 提供了一个统一的 API,供您的应用保存和检索用户凭据,包括用户名和密码。这可简化用户的登录流程,并允许用户无缝使用凭据提供程序。

前提条件

Credential Manager 的密码实现适用于搭载 Android 4.4(API 级别 19)及更高版本的设备。

概览

本指南重点介绍在应用中创建、保存密码并使用密码登录所需的更改。

  • 为应用添加依赖项:添加所需的 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

使用应用或 activity 上下文创建 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。这样,凭据就可以在两个平台之间安全地共享。