在设置新设备时恢复应用凭据

借助 Credential Manager 的恢复凭据功能,用户可以在设置新设备时恢复其应用账号。此 API 处于开发者预览版阶段,适用于搭载 Android 9 或更高版本且 Google Play 服务 (GMS) Core 版本为 242200000 或更高版本的所有设备。“恢复凭据”功能的好处包括:

  • 顺畅的用户体验:用户无需手动登录每个应用,即可恢复其应用账号。
  • 提高用户互动度:如果用户可以在设置新设备时恢复其账号,则更有可能继续使用您的应用。
  • 减少开发工作量:恢复凭据功能已与 Credential Manager 集成,因此已支持通行密钥的开发者可以添加凭据恢复功能。

工作原理

您可以使用“恢复凭据”功能创建、获取和清除相关凭据。

  1. 创建恢复凭据:当用户登录您的应用时,创建与其账号关联的恢复凭据。如果用户已启用 Google 备份,并且可用端到端加密,此凭据会存储在本地并同步到云端(应用可以选择不同步到云端)
  2. 获取恢复凭据:当用户设置新设备时,您的应用可以向 Credential Manager 请求恢复凭据。这样,您就可以自动为用户登录,而无需用户输入任何其他信息。
  3. 清除恢复凭据:当用户从您的应用中退出账号时,您应删除关联的恢复凭据。

“恢复凭据”功能可以与已实现通行密钥的后端系统顺畅集成。这种兼容性源于以下事实:通行密钥和恢复密钥(“恢复凭据”功能使用的凭据类型)都遵循相同的底层技术规范。这种一致性可确保“恢复凭据”流程能够有效检索和恢复存储在启用了通行密钥的系统中的用户凭据,从而在不同的平台和身份验证方法中提供一致且人性化的体验。

Credential Manager 底部动作条
图 1. 一张示意图,显示使用恢复凭据将应用数据恢复到新设备的过程,包括创建凭据、发起恢复流程和自动用户登录

实现

您可以通过 Credential Manager Jetpack 库使用 Restore Credentials API。如要开始使用,请按以下步骤操作:

  1. 将 Credential Manager 依赖项添加到您的项目中。

    // build.gradle.kts
    implementation("androidx.credentials:credentials:1.5.0-alpha03")
    
  2. 创建一个 CreateRestoreCredentialRequest 对象。

  3. CredentialManager 对象调用 createCredential() 方法。

    val credentialManager = CredentialManager.create(context)
    
    // On a successful authentication create a Restore Key
    // Pass in the context and CreateRestoreCredentialRequest object
    val response = credentialManager.createCredential(context, createRestoreRequest)
    

    此生成的恢复凭据是一种 WebAuthn 凭据,也称为恢复密钥

  4. 当用户设置新设备时,对 CredentialManager 对象调用 getCredential() 方法。

    // Fetch the Authentication JSON from server
    val authenticationJson = ...
    
    // Create the GetRestoreCredentialRequest object
    val options = GetRestoreCredentialOption(authenticationJson)
    val getRequest = GetCredentialRequest(Immutablelist.of(options))
    
    // The restore key can be fetched in two scenarios to
    // 1. On the first launch of app on the device, fetch the Restore Key
    // 2. In the onRestore callback (if the app implements the Backup Agent)
    val response = credentialManager.getCredential(context, getRequest)
    
  5. 当用户从您的应用中退出账号时,请对 CredentialManager 对象调用 clearCredentialState() 方法。

    // Create a ClearCredentialStateRequest object
    val clearRequest = ClearCredentialStateRequest(TYPE_CLEAR_RESTORE_CREDENTIAL)
    
    // On user log-out, clear the restore key
    val response = credentialManager.clearCredentialState(clearRequest)
    

如果您使用的是备份代理,请在 onRestore 回调中执行 getCredential 部分。这样可确保在应用数据恢复后立即恢复应用的凭据。