Mantén la coherencia entre tus credenciales y los proveedores de credenciales

Cuando un usuario crea una llave de acceso, el servidor de la parte que confía guarda ciertos detalles, mientras que el proveedor de credenciales, como el Administrador de contraseñas de Google, guarda otros. Más precisamente:

  • El servidor de la entidad de confianza guarda la credencial de clave pública.
  • El proveedor de credenciales guarda el nombre de usuario, el nombre visible, la clave privada y otros metadatos asociados. Estos metadatos ayudan a los usuarios a identificar y seleccionar la llave de acceso requerida durante el acceso.

Las posibles incoherencias entre los datos guardados en el servidor de la parte que confía y el proveedor de credenciales pueden generar malas experiencias del usuario. Pueden surgir problemas en las siguientes situaciones:

  • Se borra una credencial en el servidor de la parte que confía, pero no en el proveedor de credenciales, lo que hace que el proveedor de credenciales muestre la credencial borrada al usuario.
  • Se actualiza un nombre de usuario o un nombre visible en el servidor de la entidad externa, pero no en el proveedor de credenciales, lo que hace que el proveedor de credenciales muestre los detalles desactualizados.

La API de Signal de Credential Manager permite que las partes que confían se comuniquen con los proveedores de credenciales para borrar credenciales y actualizar metadatos del usuario, como el nombre de usuario y el nombre visible. Existen tres tipos de solicitudes compatibles para diferentes situaciones:

  • SignalUnknownCredentialRequest

    • Indica que una credencial específica ya no es válida y debe ocultarse o quitarse del proveedor de credenciales.
  • SignalAllAcceptedCredentialIdsRequest

    • Proporciona una lista de los IDs de credenciales aceptados al proveedor de credenciales.
  • SignalCurrentUserDetailsRequest

    • Actualiza los detalles de los metadatos del usuario.

Compatibilidad de versiones

La API de Signal está disponible en dispositivos que ejecutan Android 15 o versiones posteriores, y a partir de la versión 1.6.0-beta03 de la biblioteca androidx.credentials.

Implementación

Para usar la API de Signal, sigue estos pasos:

  1. Agrega la dependencia de Credential Manager a tu proyecto.

    Kotlin

    dependencies {
        implementation("androidx.credentials:credentials:1.6.0-rc01")
    }

    Groovy

    dependencies {
        implementation "androidx.credentials:credentials:1.6.0-rc01"
    }

  2. Llama a la API de Signal

    Para enviar una solicitud de señal al proveedor de credenciales, usa una solicitud de señal compatible. Cada uno de los tipos de solicitudes de indicadores requiere una solicitud JSON, como se muestra en los siguientes ejemplos:

    • Credencial desconocida (SignalUnknownCredentialRequest)

      Usa SignalUnknownCredentialRequest para indicar que se rechazó una credencial y que se considera desconocida. Cuando el proveedor de credenciales recibe este indicador, oculta o borra la credencial.

      Uso

      Usa este indicador cuando la parte que confía no pueda verificar una aserción de llave de acceso. Esto implica que la llave de acceso no es válida y el proveedor de credenciales debe ocultarla o quitarla.

      Los parámetros JSON obligatorios para esta solicitud son rpId y credentialId. Para obtener más información sobre la estructura JSON, consulta las opciones de signalUnknownCredential.

      credentialManager.signalCredentialState(
          SignalUnknownCredentialRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("credentialId", credentialId /* [String] Credential ID of the credential to be hidden or deleted */)
              }.toString()
          )
      )
      
    • Todas las credenciales aceptadas (SignalAllAcceptedCredentialIdsRequest)

      Usa SignalAllAcceptedCredentialIdsRequest para notificar a los proveedores de credenciales el conjunto de todas las credenciales aceptadas. Una vez que el proveedor de credenciales recibe el indicador, oculta o borra las credenciales que no se incluyen en esta lista, o bien muestra las credenciales que se habían ocultado y que ahora se incluyen en la lista.

      Uso

      Usa este indicador cuando la parte que confía no pueda verificar una llave de acceso. Este error significa que la llave de acceso no es válida y que el proveedor de credenciales debe ocultarla o quitarla. También puedes usar este indicador siempre que necesites transmitir el conjunto de IDs de credenciales conocidos a los proveedores de credenciales.

      Los parámetros JSON obligatorios para esta solicitud son rpId, userId y allAcceptedCredentialIds. Para obtener más información sobre la estructura JSON, consulta las opciones de signalAllAcceptedCredential.

      credentialManager.signalCredentialState(
          SignalAllAcceptedCredentialIdsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put(
                      "allAcceptedCredentialIds",
                      JSONArray(credentialIdsList /* [List<String>] List of accepted Credential IDs */)
                  )
              }.toString()
          )
      )
      
    • Detalles del usuario actual (SignalCurrentUserDetailsRequest)

      Usa SignalCurrentUserDetailsRequest para notificar a los proveedores de credenciales que se actualizaron los metadatos, como el nombre de usuario y el nombre visible de un usuario determinado, y que deberían aparecer en el proveedor de credenciales.

      Uso

      Usa este parámetro cuando el usuario o la parte que confía actualicen los metadatos de la llave de acceso asociados con la cuenta del usuario.

      Los parámetros JSON obligatorios para esta solicitud son rpId, userId, name y displayName. Para obtener más información sobre la estructura JSON, consulta las opciones de signalCurrentUserDetails.

      credentialManager.signalCredentialState(
          SignalCurrentUserDetailsRequest(
              requestJson = JSONObject().apply {
                  put("rpId", rpId /* [String] RP ID of the relying party */)
                  put("userId", userId /* [String] User ID of the current user */)
                  put("name", name /* [String] New Name to be updated for the current user */)
                  put("displayName", displayName /* [String] New display name to be updated for the current user */)
              }.toString()
          )
      )
      

Prueba la implementación

Para probar tu implementación de la API de Signals, completa los siguientes pasos:

  1. Instala el ejemplo del proveedor de credenciales llamado MyVault.

  2. Habilita MyVault como proveedor de credenciales en Configuración > Contraseñas, llaves de acceso y cuentas > Servicio preferido.

    El menú Servicio preferido en la configuración de Android, que muestra MyVault habilitado como proveedor de credenciales.

  3. Habilita todas las notificaciones de MyVault en Configuración > Apps > MyVault > Notificaciones.

    El menú Notificaciones de la app de MyVault, en el que se muestran todas las notificaciones habilitadas.

  4. Verifica que la opción Aparecer en pantalla esté activada para las notificaciones en Configuración > Apps > MyVault > Notificaciones > Categorías > Canal de notificaciones de la API de Signal.

    Configuración del canal de notificaciones de la API de Signal para MyVault, en la que se muestra la opción &quot;Aparecer en la pantalla&quot; habilitada.

  5. En tu app, activa los flujos que envían las solicitudes de señales al proveedor de credenciales. Deberías ver notificaciones de Mi Bóveda en la pantalla. Esto verifica que el proveedor de credenciales haya recibido las solicitudes.