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

사용자가 패스키를 만들면 신뢰 당사자 서버는 특정 세부정보를 저장하고 사용자 인증 정보 제공업체(예: Google 비밀번호 관리자)는 다른 세부정보를 저장합니다. 다음은 구체적인 설명입니다.

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

신뢰 당사자 서버와 사용자 인증 정보 제공업체에 저장된 데이터 간의 잠재적인 불일치는 좋지 않은 사용자 경험으로 이어질 수 있습니다. 다음과 같은 시나리오에서 문제가 발생할 수 있습니다.

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

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

  • SignalUnknownCredentialRequest

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

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

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

버전 호환성

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

구현

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

  1. 프로젝트에 인증 관리자 종속 항목을 추가합니다.

    Kotlin

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

    Groovy

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

  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를 사용자 인증 정보 제공업체로 사용 설정합니다.

    Android 설정의 선호하는 서비스 메뉴에 MyVault가 사용자 인증 정보 제공업체로 사용 설정되어 있습니다.

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

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

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

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

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