设备能力
设备能力 · 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)
}关键:
- 传
Activitycontext——系统可能显示凭据选择界面。 getCredential返回被选中的凭据,不代表服务端已完成登录——服务端要再验证。
凭据类型
| 类型 | 用途 |
|---|---|
PasswordCredential | 用户名 + 密码 |
PublicKeyCredential | Passkey(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清提供方会话。