인증 관리자 - Holder API

Credential Manager - Holder API를 사용하면 Android 앱이 디지털 사용자 인증 정보를 관리하고 인증자에게 표시할 수 있습니다.

시작하기

인증 관리자 - Holder API를 사용하려면 다음 종속 항목을 앱 모듈의 빌드 스크립트에 추가합니다.

// In your app module's build.gradle:
dependencies {
    implementation(libs.androidx.registry.provider)
    implementation(libs.androidx.registry.provider.play.services)
}

// In libs.versions.toml:
registryDigitalCredentials = "1.0.0-alpha01"

androidx-registry-provider = { module = "androidx.credentials.registry:registry-provider", version.ref = "registryDigitalCredentials" }
androidx-registry-provider-play-services = { module = "androidx.credentials.registry:registry-provider-play-services", version.ref = "registryDigitalCredentials" }

인증 관리자에 사용자 인증 정보 등록

월렛은 요청이 들어올 때 인증 관리자가 사용자 인증 정보를 필터링하고 사용자 인증 정보 선택기에 표시할 수 있도록 사용자 인증 정보 메타데이터를 등록해야 합니다.

인증 관리자의 디지털 사용자 인증 정보 UI를 보여주는 이미지
그림 1. 디지털 인증 UI

인증 관리자 선택기 UI

이 메타데이터의 형식은 RegisterCredentialsRequest에 전달됩니다. [RegistryManager][1]를 만들고 사용자 인증 정보를 등록합니다.

이 예시에서는 사용자 인증 정보 항목의 데이터베이스에서 메타데이터가 컴파일됩니다. 앱 로드 시 메타데이터를 등록하는 샘플 월렛의 참조를 확인할 수 있습니다. 향후 Jetpack API에서 사용자 인증 정보 데이터베이스 컴포지션을 지원할 예정입니다. 그러면 사용자 인증 정보 메타데이터를 잘 정의된 데이터 구조로 등록할 수 있습니다.

레지스트리는 기기 재부팅 시에도 유지됩니다. 동일한 ID + 유형의 동일한 레지스트리를 다시 등록하면 이전 레지스트리 레코드가 덮어쓰기됩니다. 따라서 사용자 인증 정보 데이터가 변경된 경우에만 재등록하면 됩니다.

선택사항: 일치 항목 만들기

인증 관리자는 프로토콜을 중립적으로 취급합니다. 메타데이터 레지스트리를 불투명 블로프로 취급하고 콘텐츠를 확인하거나 검사하지 않습니다. 따라서 지갑은 지갑 자체 데이터를 처리하고 수신 요청을 기반으로 디스플레이 메타데이터를 생성할 수 있는 실행 가능한 바이너리인 일치자를 제공해야 합니다. 인증 관리자는 네트워크 또는 디스크 액세스 없이 샌드박스 환경에서 매처를 실행하므로 UI가 사용자에게 렌더링되기 전에 지갑에 아무것도 유출되지 않습니다.

Credential Manager API는 현재 OpenID4VP와 같은 널리 사용되는 프로토콜의 매처를 제공합니다. 아직 공식적으로 출시되지 않았으므로 지금은 OpenID4VP v24 프로토콜에 Google의 샘플 매처를 사용하세요.

선택한 사용자 인증 정보 처리

다음으로 지갑은 사용자가 사용자 인증 정보를 선택할 때 이를 처리해야 합니다. androidx.credentials.registry.provider.action.GET_CREDENTIAL 인텐트 필터를 리슨하는 Activity를 정의할 수 있습니다. 샘플 지갑에서 이 절차를 확인할 수 있습니다.

활동을 실행하는 인텐트에는 Verifier 요청과 호출 출처가 포함되며, 이를 PendingIntentHandler.retrieveProviderGetCredentialRequest 함수로 추출할 수 있습니다. API는 지정된 인증 요청과 연결된 모든 정보를 포함하는 ProviderGetCredentialRequest를 반환합니다. 주요 구성요소는 세 가지입니다.

  • 요청을 실행한 앱입니다. getCallingAppInfo를 사용하여 이를 검색할 수 있습니다.
  • 선택한 사용자 인증 정보입니다. selectedEntryId 확장 프로그램 메서드를 통해 사용자가 선택한 후보에 관한 정보를 가져올 수 있습니다. 이 정보는 등록한 사용자 인증 정보 ID와 일치합니다.
  • 인증자가 제출한 특정 요청 getCredentialOptions 메서드에서 가져올 수 있습니다. 이 경우 이 목록에 디지털 사용자 인증 정보 요청이 포함된 GetDigitalCredentialOption가 표시됩니다.

대부분의 경우 인증자는 디지털 사용자 인증 정보 표시 요청을 실행하므로 다음 샘플 코드로 처리할 수 있습니다.

request.credentialOptions.forEach { option ->
    if (option is GetDigitalCredentialOption) {
        Log.i(TAG, "Got DC request: ${option.requestJson}")
        processRequest(option.requestJson)
    }
}

샘플 월렛에서 예를 확인할 수 있습니다.

월렛 UI 렌더링

사용자 인증 정보가 선택되면 지갑이 호출되고 사용자는 UI를 통해 이동합니다. 샘플에서는 생체 인식 메시지입니다.

사용자 인증 정보 응답 반환

지갑에서 결과를 다시 전송할 준비가 되면 사용자 인증 정보 응답으로 활동을 완료하여 전송할 수 있습니다.

PendingIntentHandler.setGetCredentialResponse(
    resultData,
    GetCredentialResponse(DigitalCredential(response.responseJson))
)
setResult(RESULT_OK, resultData)
finish()

예외가 있는 경우 마찬가지로 사용자 인증 정보 예외를 전송할 수 있습니다.

PendingIntentHandler.setGetCredentialException(
    resultData,
    GetCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

컨텍스트에서 사용자 인증 정보 응답을 반환하는 방법의 예는 샘플 앱을 참고하세요.