사용자 인증 정보를 사용자 인증 정보 제공업체와 일치시키기

사용자가 패스키를 생성하면 신뢰 당사자 서버는 특정 세부정보를 저장하고 Google 비밀번호 관리자와 같은 인증 정보 제공업체는 다른 세부정보를 저장합니다. 구체적으로는 다음과 같습니다.

  • 신뢰 당사자 서버가 공개 키 사용자 인증 정보를 저장합니다.
  • 인증 정보 제공자는 사용자 이름, 표시 이름, 비공개 키, 기타 연결된 메타데이터를 저장합니다. 이 메타데이터는 사용자가 로그인할 때 필요한 패스키를 식별하고 선택하는 데 도움이 됩니다.

신뢰 당사자 서버에 저장된 데이터와 인증 제공자 간의 불일치로 인해 사용자 경험이 저하될 수 있습니다. 다음 시나리오에서 문제가 발생할 수 있습니다.

  • 사용자 인증 정보가 신뢰 당사자 서버에서는 삭제되었지만 사용자 인증 정보 제공업체에서는 삭제되지 않아 사용자 인증 정보 제공업체에서 삭제된 사용자 인증 정보를 사용자에게 표시합니다.
  • 신뢰 당사자 서버에서 사용자 이름 또는 표시 이름이 업데이트되었지만 인증 정보 제공자에서는 업데이트되지 않아 인증 정보 제공자에 오래된 세부정보가 표시됩니다.

사용자 인증 정보 관리자의 신호 API를 사용하면 신뢰 당사자가 사용자 인증 정보 제공자와 통신하여 사용자 인증 정보를 삭제하고 사용자 메타데이터(예: 사용자 이름 및 표시 이름)를 업데이트할 수 있습니다. 다양한 시나리오에 대해 지원되는 요청 유형은 세 가지입니다.

  • SignalUnknownCredentialRequest

    • 특정 사용자 인증 정보가 더 이상 유효하지 않으며 사용자 인증 정보 제공자에서 숨기거나 삭제해야 함을 나타냅니다.
  • SignalAllAcceptedCredentialIdsRequest

    • 허용된 사용자 인증 정보 ID 목록을 사용자 인증 정보 제공업체에 제공합니다.
  • SignalCurrentUserDetailsRequest

    • 사용자의 메타데이터 세부정보를 업데이트합니다.

버전 호환성

신호 API는 Android 15 이상을 실행하는 기기에서 사용할 수 있으며 androidx.credentials 라이브러리의 버전 1.6.0-beta03부터 사용할 수 있습니다.

구현

Signal API를 사용하려면 다음 단계를 따르세요.

  1. 프로젝트에 Credential Manager 종속 항목을 추가합니다.

    Kotlin

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

    Groovy

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

  2. Signal API 호출

    사용자 인증 정보 제공업체에 신호 요청을 보내려면 지원되는 신호 요청을 사용하세요. 각 신호 요청 유형에는 다음 예와 같이 JSON 요청이 필요합니다.

    • 알 수 없는 사용자 인증 정보 (SignalUnknownCredentialRequest)

      SignalUnknownCredentialRequest을 사용하여 사용자 인증 정보가 거부되었으며 알 수 없는 것으로 간주됨을 알립니다. 사용자 인증 정보 제공자가 이 신호를 수신하면 사용자 인증 정보를 숨기거나 삭제합니다.

      사용 정보

      신뢰 당사자가 패스키 어설션을 확인하지 못하는 경우 이 신호를 사용합니다. 이는 패스키가 유효하지 않으며 사용자 인증 정보 제공업체에서 숨기거나 삭제해야 함을 의미합니다.

      이 요청에 필요한 JSON 매개변수는 rpIdcredentialId입니다. 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을 사용하여 허용된 모든 사용자 인증 정보 집합으로 사용자 인증 정보 제공자에게 알립니다. 신호가 사용자 인증 정보 제공업체에 수신되면 사용자 인증 정보 제공업체는 이 목록에 포함되지 않은 사용자 인증 정보를 숨기거나 삭제하고, 이제 목록에 포함된 이전에 숨겨진 사용자 인증 정보를 숨김 해제합니다.

      사용 정보

      신뢰 당사자가 패스키 확인에 실패한 경우 이 신호를 사용합니다. 이 실패는 패스키가 유효하지 않으며 사용자 인증 정보 제공업체에서 숨기거나 삭제해야 함을 의미합니다. 알려진 사용자 인증 정보 ID 집합을 사용자 인증 정보 제공업체에 브로드캐스트해야 할 때마다 이 신호를 사용할 수도 있습니다.

      이 요청에 필요한 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를 사용자 인증 정보 제공자로 사용 설정합니다.

    인증 관리자로 사용 설정된 MyVault를 보여주는 Android 설정의 기본 서비스 메뉴

  3. 설정 > > MyVault > 알림에서 MyVault의 모든 알림을 사용 설정합니다.

    모든 알림이 사용 설정된 MyVault 앱의 알림 메뉴

  4. 설정 > > MyVault > 알림 > 카테고리 > Signal API 알림 채널에서 알림에 대해 화면에 팝업이 사용 설정되어 있는지 확인합니다.

    MyVault의 신호 API 알림 채널 설정으로, &#39;화면에 팝업&#39; 옵션이 사용 설정되어 있습니다.

  5. 앱에서 신호 요청을 사용자 인증 정보 제공업체에 전송하는 흐름을 트리거합니다. 화면에 MyVault의 알림이 표시됩니다. 이렇게 하면 사용자 인증 정보 제공업체가 요청을 수신했는지 확인할 수 있습니다.