Skip to content

Credential Manager 凭据管理器

源:凭据管理器概览

Credential Manager 是 Android 的一个新库,旨在统一应用的登录体验。它支持多种身份认证方式,包括通行密钥 (Passkeys)、密码和第三方登录(如 Google 登录)。

1. 核心功能

  • 通行密钥 (Passkeys): 目前最安全的身份认证方式,利用指纹或面容替代密码。
  • 统一界面: 自动为用户弹出单一、整洁的底板进行选择。
  • 向后兼容: 替代了旧版的 Google Sign-In 和 Smart Lock。

2. 添加依赖

kotlin
[versions]
credential = "1.2.2"
googleid = "1.1.0"

[libraries]
androidx-credentials = { group = "androidx.credentials", name = "credential", version.ref = "credential" }
# 可选:Google 登录支持
google-identity-googleid = { group = "com.google.android.libraries.identity.googleid", name = "googleid", version.ref = "googleid" }
kotlin
dependencies {
    implementation(libs.androidx.credentials)
    // 可选:Google 登录支持
    implementation(libs.google.identity.googleid)
}

3. 请求登录 (Get Credentials)

第一步:创建请求

kotlin
val credentialManager = CredentialManager.create(context)

// 1. 请求通行密钥
val getPasskeyOption = GetPasskeyOption()

// 2. 请求密码
val getPasswordOption = GetPasswordOption()

val getCredRequest = GetCredentialRequest(
    listOf(getPasskeyOption, getPasswordOption)
)

第二步:发起调用

kotlin
lifecycleScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = this@MainActivity,
            request = getCredRequest
        )
        handleSignIn(result)
    } catch (e: GetCredentialException) {
        // 处理用户取消或错误
    }
}

第三步:处理结果

kotlin
private fun handleSignIn(result: GetCredentialResponse) {
    when (val credential = result.credential) {
        is PasswordCredential -> {
            val id = credential.id
            val password = credential.password
            // 使用传统密码登录
        }
        is PublicKeyCredential -> {
            val jsonResponse = credential.authenticationResponseJson
            // 发送到服务器验证通行密钥
        }
    }
}

4. 创建通行密钥 (Create Passkey)

当用户成功注册后,你可以引导他们创建通行密钥以便下次免密登录。

kotlin
val createRequest = CreatePublicKeyCredentialRequest(
    requestJson = "从服务器获取的配置 JSON"
)

lifecycleScope.launch {
    try {
        credentialManager.createCredential(context, createRequest)
        // 创建成功
    } catch (e: CreateCredentialException) {
        // 处理错误
    }
}

5. 最佳实践

  • 平滑迁移: 即使你的应用目前不支持 Passkeys,也可以先集成此库来统一处理密码和 Google 登录。
  • UI 触发: 建议在登录界面的“继续”按钮或自动对焦输入框时触发 getCredential