Credential Manager:统一登录入口 · AndroidX 源码指南
AAndroidX 源码指南
设备能力
设备能力 · androidx.camera

Credential Manager:统一登录入口Camera 1.7.0-alpha03

组织密码、Passkey 和自定义凭据的请求、选择与返回类型。

最后更新 2026-08-01

复制即用:获取凭据

val manager = CredentialManager.create(activity)
val request = GetCredentialRequest(
    credentialOptions = listOf(
        GetPasswordOption(),
        GetPublicKeyCredentialOption(requestJson),
    )
)

val response = manager.getCredential(activity, request)
when (val credential = response.credential) {
    is PasswordCredential -> signIn(credential.id, credential.password)
    is PublicKeyCredential -> verifyPasskeyOnServer(credential.authenticationResponseJson)
    is CustomCredential -> handleCustomCredential(credential)
}

关键

  • Activity context——系统可能显示凭据选择界面。
  • getCredential 返回被选中的凭据,不代表服务端已完成登录——服务端要再验证。

凭据类型

类型用途
PasswordCredential用户名 + 密码
PublicKeyCredentialPasskey(WebAuthn)
CustomCredential自定义提供方(联邦登录等)

Passkey:服务端生成与验证

// 创建 Passkey(注册)
val createRequest = CreateCredentialRequest(
    credentialOptions = listOf(
        CreatePublicKeyCredentialOption(creationJson),   // 服务端生成
    )
)
val result = manager.createCredential(activity, createRequest)

// 登录(认证)
val getRequest = GetCredentialRequest(
    credentialOptions = listOf(
        GetPublicKeyCredentialOption(requestJson),       // 服务端生成
    )
)
val response = manager.getCredential(activity, getRequest)

原则

  • request JSON(challenge 等)由服务端生成
  • 返回的 authenticationResponseJson服务端验证
  • 客户端不参与密码学验证逻辑——只传递。

创建凭据与状态清理

// 创建(注册新凭据)
manager.createCredential(activity, request)

// 退出登录/切换账户后,清除提供方会话
manager.clearCredentialState(ClearCredentialStateRequest())

clearCredentialState 用于清除提供方(Google 等)保存的会话状态,不是必须每次都调。

常见陷阱

  • 传 Application context:需要显示 UI 时必须 Activity。
  • 本地拿到就当登录成功:凭据选中 ≠ 服务端验证通过。
  • requestJson 客户端生成:必须服务端生成(安全)。
  • 只支持密码:现代应用应同时支持 Passkey。
  • 多提供方冲突:多个凭据提供方需要协调(GetCredentialRequest 顺序)。

复制即用

class LoginViewModel(private val manager: CredentialManager) : ViewModel() {

    suspend fun signIn(activity: Activity, serverRequestJson: String): String {
        val response = manager.getCredential(
            activity,
            GetCredentialRequest(
                listOf(
                    GetPasswordOption(),
                    GetPublicKeyCredentialOption(serverRequestJson),
                )
            )
        )
        return when (val c = response.credential) {
            is PasswordCredential -> "password:${c.id}:${c.password}"
            is PublicKeyCredential -> "passkey:${c.authenticationResponseJson}"
            else -> "unknown"
        }
    }
}

要点

  • getCredential/createCredential 需要 Activity context。
  • 密码、Passkey、CustomCredential 三种类型分支处理。
  • Passkey 的 request/response 都在服务端生成/验证。
  • 退出登录用 clearCredentialState 清提供方会话。

相关页面