Поддерживайте единообразие учетных данных у поставщиков учетных данных.

Когда пользователь создает пароль, сервер зависимой стороны сохраняет определенные данные, а поставщик учетных данных, например, Google Password Manager, сохраняет другие. В частности:

  • Сервер зависимой стороны сохраняет учетные данные открытого ключа.
  • Поставщик учетных данных сохраняет имя пользователя, отображаемое имя, закрытый ключ и другие связанные метаданные. Эти метаданные помогают пользователям идентифицировать и выбрать необходимый пароль при входе в систему.

Возможные несоответствия между данными, сохраненными на сервере зависимой стороны и поставщиком учетных данных, могут привести к негативному пользовательскому опыту. Проблемы могут возникнуть в следующих сценариях:

  • Учетные данные удаляются на сервере зависимой стороны, но не на сервере поставщика учетных данных, в результате чего поставщик учетных данных отображает удаленные учетные данные пользователю.
  • Имя пользователя или отображаемое имя обновляется на сервере зависимой стороны, но не на сервере поставщика учетных данных, в результате чего поставщик учетных данных отображает устаревшие данные.

API Signal в Credential Manager позволяет зависимым сторонам взаимодействовать с поставщиками учетных данных для удаления учетных данных и обновления метаданных пользователя, таких как имя пользователя и отображаемое имя. Поддерживаются три типа запросов для различных сценариев:

  • SignalUnknownCredentialRequest

    • Указывает на то, что конкретные учетные данные больше недействительны и должны быть скрыты от поставщика учетных данных или удалены из него.
  • SignalAllAcceptedCredentialIdsRequest

    • Предоставляет поставщику учетных данных список принимаемых идентификаторов учетных данных.
  • SignalCurrentUserDetailsRequest

    • Обновляет метаданные пользователя.

Совместимость версий

API Signal доступен на устройствах под управлением Android 15 и выше, а также начиная с версии 1.6.0-beta03 библиотеки androidx.credentials .

Выполнение

Для использования API Signal выполните следующие действия:

  1. Добавьте зависимость Credential Manager в свой проект.

    Котлин

    dependencies {
        implementation("androidx.credentials:credentials:1.7.0-alpha01")
    }

    Круто

    dependencies {
        implementation "androidx.credentials:credentials:1.7.0-alpha01"
    }

  2. Вызов API Signal

    Для отправки запроса сигнала поставщику учетных данных используйте поддерживаемый тип запроса сигнала. Для каждого типа запроса сигнала требуется запрос в формате JSON, как показано в следующих примерах:

    • Неизвестные учетные данные ( SignalUnknownCredentialRequest )

      Используйте SignalUnknownCredentialRequest , чтобы сообщить о том, что учетные данные отклонены и считаются неизвестными. Когда поставщик учетных данных получает этот сигнал, он скрывает или удаляет учетные данные.

      Использование

      Этот сигнал используется, когда проверяющая сторона не может подтвердить утверждение о наличии пароля. Это означает, что пароль недействителен и должен быть скрыт от поставщика учетных данных или удален им.

      Обязательными параметрами JSON для этого запроса являются rpId и credentialId . Для получения дополнительной информации о структуре JSON см. параметры 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()
          )
      )
      
    • Все принятые учетные данные ( SignalAllAcceptedCredentialIdsRequest )

      Используйте SignalAllAcceptedCredentialIdsRequest , чтобы уведомить поставщиков учетных данных о наборе всех принятых учетных данных. После получения сигнала поставщик учетных данных скрывает или удаляет любые учетные данные, не включенные в этот список, или отображает любые ранее скрытые учетные данные, которые теперь включены в список.

      Использование

      Этот сигнал используется, когда проверка пароля стороной, проверяющей данные, завершается неудачей. Эта неудача означает, что пароль недействителен и должен быть скрыт от поставщика учетных данных или удален им. Вы также можете использовать этот сигнал всякий раз, когда вам необходимо передать набор известных идентификаторов учетных данных поставщикам учетных данных.

      Обязательными параметрами JSON для этого запроса являются rpId , userId и allAcceptedCredentialIds . Для получения дополнительной информации о структуре JSON см. параметры 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()
          )
      )
      
    • Сведения о текущем пользователе ( SignalCurrentUserDetailsRequest )

      Используйте SignalCurrentUserDetailsRequest , чтобы уведомить поставщиков учетных данных о том, что метаданные, такие как имя пользователя и отображаемое имя для данного пользователя, были обновлены и должны отображаться в поставщике учетных данных.

      Использование

      Этот сигнал следует использовать, когда пользователь или зависимая сторона обновляет метаданные ключа доступа, связанные с учетной записью пользователя.

      Обязательными параметрами JSON для этого запроса являются rpId , userId , name и displayName . Для получения дополнительной информации о структуре JSON см. параметры 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()
          )
      )
      

Протестируйте реализацию

Для проверки вашей реализации Signal API выполните следующие шаги:

  1. Установите пример поставщика учетных данных под названием MyVault .

  2. Включите MyVault в качестве поставщика учетных данных в разделе «Настройки» > «Пароли, ключи доступа и учетные записи» > «Предпочитаемая служба» .

    В меню «Предпочитаемые сервисы» в настройках Android отображается информация о том, что MyVault включен в качестве поставщика учетных данных.

  3. Включите все уведомления для MyVault в разделе «Настройки» > «Приложения» > «MyVault» > «Уведомления» .

    Меню уведомлений приложения MyVault, отображающее все включенные уведомления.

  4. Убедитесь, что для уведомлений включена функция «Всплывающие уведомления на экране» в разделе «Настройки» > «Приложения» > «Мое хранилище» > «Уведомления» > «Категории» > «Канал уведомлений Signal API» .

    Настройки канала уведомлений Signal API для MyVault, отображающие включенную опцию «Всплывающее окно на экране».

  5. В вашем приложении запустите потоки, которые отправляют запросы сигналов поставщику учетных данных. На экране должны появиться уведомления от MyVault. Это подтверждает, что поставщик учетных данных получил запросы.