恢复凭据

凭据管理器的恢复凭据功能允许用户在设置新设备时恢复其应用帐户。此 API 处于开发者预览阶段,可在所有安装了 Android 9 或更高版本以及 Google Play 服务 (GMS) 核心版本 242200000 或更高版本的设备上使用。恢复凭据功能的优势包括

  • 无缝的用户体验:用户可以恢复其应用帐户,而无需手动登录到每个单独的应用。
  • 提升用户参与度:如果用户可以在设置新设备时恢复其帐户,则他们更有可能继续使用您的应用。
  • 降低开发工作量:恢复凭据功能与凭据管理器集成,因此已支持密钥通行码的开发者可以添加凭据恢复功能。

工作原理

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

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

恢复凭据功能可以与已实现密钥通行码的后端系统无缝集成。这种兼容性源于密钥通行码和恢复密钥(恢复凭据功能使用的凭据类型)都遵循相同的底层技术规范这一事实。这种一致性确保恢复凭据流程可以有效地检索和恢复存储在支持密钥通行码的系统中的用户凭据,从而在不同的平台和身份验证方法之间提供一致且用户友好的体验。

Credential Manager bottom sheet
图 1. 描述使用恢复凭据将应用数据恢复到新设备的示意图,包括创建凭据、启动恢复流程和自动用户登录

实施

恢复凭据 API 可通过凭据管理器 Jetpack 库获得。要开始使用,请按照以下步骤操作

  1. 将凭据管理器依赖项添加到您的项目中。

    // 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)
    

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

  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 部分。这可确保应用数据恢复后立即恢复应用的凭据。