Xác minh thông tin xác thực kỹ thuật số

Tính năng xác minh thông tin đăng nhập điện tử trong ứng dụng Android có thể được dùng để xác thực và uỷ quyền danh tính của người dùng (chẳng hạn như giấy tờ tuỳ thân do chính phủ cấp), các thuộc tính về người dùng đó (chẳng hạn như giấy phép lái xe, bằng cấp học thuật hoặc các thuộc tính như tuổi hoặc địa chỉ) hoặc các trường hợp khác cần phát hành và xác minh thông tin đăng nhập để xác nhận tính xác thực của một thực thể.

Thông tin xác thực kỹ thuật số là một tiêu chuẩn công khai của W3C về chương trình ươm tạo. Tiêu chuẩn này chỉ định cách truy cập thông tin xác thực kỹ thuật số có thể xác minh của người dùng từ ví kỹ thuật số và được triển khai cho các trường hợp sử dụng web bằng API Quản lý thông tin xác thực của W3C. Trên Android, API DigitalCredential của Trình quản lý thông tin xác thực được dùng để xác minh thông tin xác thực số.

Triển khai

Để xác minh thông tin xác thực kỹ thuật số trong dự án Android, hãy làm như sau:

  1. Thêm các phần phụ thuộc vào tập lệnh bản dựng của ứng dụng và khởi chạy lớp CredentialManager.
  2. Tạo một yêu cầu thông tin xác thực kỹ thuật số và sử dụng yêu cầu đó để khởi chạy DigitalCredentialOption, sau đó tạo GetCredentialRequest.
  3. Chạy luồng getCredential bằng yêu cầu đã tạo để nhận được GetCredentialResponse thành công hoặc xử lý mọi trường hợp ngoại lệ có thể xảy ra. Sau khi truy xuất thành công, hãy xác thực phản hồi.

Thêm phần phụ thuộc và khởi chạy

Thêm các phần phụ thuộc sau vào tập lệnh bản dựng Gradle:

dependencies {
    implementation("androidx.credentials:credentials:1.5.0-beta01")
    implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}

Tiếp theo, hãy khởi chạy một thực thể của lớp CredentialManager.

val credentialManager = CredentialManager.create(context)

Tạo yêu cầu thông tin xác thực kỹ thuật số

Tạo yêu cầu thông tin xác thực kỹ thuật số và sử dụng yêu cầu đó để khởi chạy DigitalCredentialOption.

// The request in the JSON format to conform with
// the JSON-ified Digital Credentials API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
    GetDigitalCredentialOption(requestJson = requestJson)

// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
    listOf(digitalCredentialOption)
)

Lấy thông tin xác thực

Chạy quy trình getCredential bằng yêu cầu đã tạo. Bạn sẽ nhận được GetCredentialResponse thành công hoặc GetCredentialException nếu yêu cầu không thành công.

Quy trình getCredential kích hoạt hộp thoại hệ thống Android để hiển thị các tuỳ chọn thông tin xác thực hiện có của người dùng và thu thập lựa chọn của họ. Tiếp theo, ứng dụng ví chứa thông tin xác thực đã chọn sẽ hiển thị giao diện người dùng để thu thập sự đồng ý và thực hiện các hành động cần thiết để tạo phản hồi thông tin xác thực kỹ thuật số.

coroutineScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = activityContext,
            request = getCredRequest
        )
        verifyResult(result)
    } catch (e : GetCredentialException) {
        handleFailure(e)
    }
}

// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
    val credential = result.credential
    when (credential) {
        is DigitalCredential -> {
            val responseJson = credential.credentialJson
            validateResponseOnServer(responseJson)
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential ${credential.type}")
        }
    }
}

// Handle failure.
fun handleFailure(e: GetCredentialException) {
  when (e) {
        is GetCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to share the credential.
        }
        is GetCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is NoCredentialException -> {
            // No credential was available.
        }
        is CreateCredentialUnknownException -> {
            // An unknown, usually unexpected, error has occurred. Check the
            // message error for any additional debugging information.
        }
        is CreateCredentialCustomException -> {
            // You have encountered a custom error thrown by the wallet.
            // If you made the API call with a request object that's a
            // subclass of CreateCustomCredentialRequest using a 3rd-party SDK,
            // then you should check for any custom exception type constants
            // within that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
    }
}