این راهنما نحوه استفاده از DigitalCredential API را برای به دست آوردن شماره تلفن تأیید شده برای کاربران خود شرح می دهد. فرآیند شامل دو مرحله است:
- درخواست
TS.43 token
: برنامه مشتری شما ("تأیید کننده") یک رمز موقت TS.43 از دستگاه کاربر درخواست می کند.TS.43 token
یک اعتبارنامه صادر شده توسط حامل است که نشان دهنده هویت کاربر است. - رمز را با شماره تلفن مبادله کنید : باطن برنامه شما
TS.43 token
با یک جمعآورنده یا حامل برای شماره تلفن تأیید شده کاربر مبادله میکند.
پیش نیازها
برای اجرای تأیید شماره تلفن با DigitalCredential API، به یک حساب کاربری با یک جمعکننده نیاز دارید. یک جمعکننده با حاملها تعامل میکند و سطح API لازم را برای برنامه شما فراهم میکند، معمولاً به عنوان یک نقطه پایانی API ابری قابل پرداخت.
همچنین باید وابستگی های زیر را به اسکریپت ساخت Gradle خود اضافه کنید:
کاتلین
dependencies { implementation("androidx.credentials:credentials:1.6.0-alpha05") implementation("androidx.credentials:credentials-play-services-auth:1.6.0-alpha05") }
شیار
dependencies { implementation "androidx.credentials:credentials:1.6.0-alpha05" implementation "androidx.credentials:credentials-play-services-auth:1.6.0-alpha05" }
پیاده سازی
فرآیند end-to-end به طور کلی مراحل زیر را دنبال می کند:
- درخواست پارامترهای DCQL (Digital Credential Query Language) از یک جمع کننده : یک یا چند جمع کننده را فراخوانی کنید و مجموعه ای از پارامترهای DCQL را درخواست کنید. DCQL به شما امکان می دهد اعتبار دیجیتالی دقیقی را که از هر جمع کننده نیاز دارید مشخص کنید.
ایجاد درخواست OpenID4VP : از باطن برنامه خود، درخواست OpenID4VP را ایجاد کنید، در حالی که پارامترهای DCQL را از جمعآوری میکنید. سپس، درخواست OpenID4VP را به برنامه مشتری خود ارسال کنید.
تماس با Credential Manager API : در برنامه مشتری خود، از Credential Manager API برای ارسال درخواست OpenID4VP به سیستم عامل استفاده کنید. در پاسخ، یک شی پاسخ OpenID4VP حاوی
TS.43 Digital Credential
دریافت می کنید. این اعتبار رمزگذاری شده است و فقط توسط جمع کننده مرتبط قابل رمزگشایی است. پس از دریافت رمز حامل، پاسخ برنامه مشتری خود را به باطن برنامه ارسال کنید.اعتبارسنجی پاسخ : در باطن برنامه خود، پاسخ OpenID4VP را تأیید کنید.
مبادله برای شماره تلفن : از پشتیبان برنامه خود،
TS.43 Digital Credential
به جمع کننده ارسال کنید. تجمیع کننده اعتبارنامه را تأیید می کند و شماره تلفن تأیید شده را برمی گرداند.
درخواست پارامترهای DCQL از یک جمع کننده
از باطن برنامهتان، درخواستی برای یک شی اعتباری زبان اعتبار دیجیتال (DCQL) به جمعکننده ارسال کنید. مطمئن شوید که یک nonce و یک شناسه درخواست در درخواست خود وارد کنید. Aggregator شی اعتبار DCQL را برمی گرداند که ساختاری شبیه به زیر دارد:
{
// The credential ID is mapped to the request ID that is sent in your request to the aggregator.
"id": "aggregator1",
"format": "dc-authorization+sd-jwt",
"meta": {
"vct_values": [
"number-verification/device-phone-number/ts43"
],
"credential_authorization_jwt": "..."
},
"claims": [
{
"path": ["subscription_hint"],
"values": [1]
},
{
"path": ["phone_number_hint"],
"values": ["+14155552671"]
}
]
}
درخواست OpenID4VP را ایجاد کنید
ابتدا، از باطن برنامه خود، یک شی dcql_query
با قرار دادن شی اعتبار DCQL در یک آرایه credentials
تو در تو در یک شی dcql_query
ایجاد کنید، همانطور که در مثال زیر نشان داده شده است:
"dcql_query": {
"credentials": [
"id": "aggregator1",
"format": "dc-authorization+sd-jwt",
"meta": {
"vct_values": [
"number-verification/device-phone-number/ts43"
],
"credential_authorization_jwt": "..."
},
"claims": [
{
"path": ["subscription_hint"],
"values": [1]
},
{
"path": ["phone_number_hint"],
"values": ["+14155552671"]
}
]
]
}
سپس یک درخواست OpenID4VP با ساختار زیر ایجاد کنید:
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": { ... }
}
}
-
protocol
: برای درخواست تأیید شماره تلفن باید رویopenid4vp-v1-unsigned
تنظیم شود. -
response_type
وresponse_mode
: ثابت هایی که فرمت درخواست را با مقادیر ثابتvp_token
وdc_api
نشان می دهند. -
nonce
: یک مقدار منحصر به فرد ایجاد شده توسط باطن شما برای هر درخواست. nonce در شیء اعتبار جمعآوری کننده DCQL باید با این nonce مطابقت داشته باشد. -
dcql_query
: در این مورد، ازdcql_query
استفاده کنید تا مشخص کنید که یکTS.43 Digital Credential
در حال درخواست است. شما همچنین می توانید سایر اعتبارنامه های دیجیتال را در اینجا درخواست کنید.
سپس، درخواست OpenID4VP را در یک شی درخواست DigitalCredential API بپیچید و آن را به برنامه مشتری ارسال کنید.
{
"requests":
[
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": { ... }
}
}
]
}
قطعه زیر نحوه ایجاد درخواست DigitalCredential API را نشان می دهد:
def GenerateDCRequest():
credentials = []
aggregator1_dcql = call_aggregator_endpoint(nonce, "aggregator1", additional_params)
credentials.append(aggregator1_dcql) # You can optionally work with multiple
# aggregators, or request other types of credentials
val dc_request =
{
"requests":
[
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"response_type": "vp_token",
"response_mode": "dc_api",
"nonce": "...",
"dcql_query": {"credentials": credentials}
}
}
]
}
return dc_request
با Credential Manager API تماس بگیرید
در برنامه مشتری خود، با درخواست DigitalCredential API که توسط باطن برنامه شما ارائه شده است، با Credential Manager API تماس بگیرید.
val requestJson = generateTs43DigitalCredentialRequestFromServer()
val digiCredOption = GetDigitalCredentialOption(requestJson = requestJson)
val getCredRequest = GetCredentialRequest(
listOf(digiCredOption)
)
coroutineScope.launch {
try {
val response = credentialManager.getCredential(
context = activityContext,
request = getCredRequest
)
val credential = response.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}")
}
}
} catch (e : GetCredentialException) {
// If user cancels the operation, the feature isn't available, or the
// SIM doesn't support the feature, a GetCredentialCancellationException
// will be returned. Otherwise, a GetCredentialUnsupportedException will
// be returned with details in the exception message.
handleFailure(e)
}
}
پاسخ DigitalCredential API حاوی پاسخ OpenID4VP است. یک json اعتبار معمولی از نتیجه DigitalCredential
به شرح زیر است:
{
"protocol": "openid4vp-v1-unsigned",
"data": {
"vp_token": {
"aggregator1": ["eyJhbGciOiAiRVMy..."] # The encrypted TS.43 Digital
# Credential in an array structure.
}
}
}
از برنامه مشتری خود، پاسخ DigitalCredential API را به سرور پشتیبان ارسال کنید، جایی که می توان آن را تأیید کرد و برای مبادله شماره تلفن تأیید شده با یک جمع کننده استفاده کرد.
پاسخ اعتبار دیجیتال را تأیید کنید
در زیر نمونه ای از نحوه تجزیه پاسخ و انجام مرحله اعتبار سنجی در باطن برنامه شما آمده است:
def processDigitalCredentialsResponse(response):
# Step 1: Parse out the TS.43 Digital Credential from the response
openId4VpResponse = response['data']
ts43_digital_credential = response['vp_token']["aggregator1"][0]
# Step 2: Perform response validation
verifyResponse(ts43_digital_credential)
def verifyResponse(ts43_digital_credential):
# The returned ts43_digital_credential is an SD-JWT-based Verifiable Credentials
# (SD-JWT VC) as defined in this IETF spec. The section 3.4 of the specification
# outlines how to validate the credential. At a high level, the steps involves
# validating (1) the nonce in the response credential matches the one in the
# request, (2) the integrity of the credential by checking the credential is
# signed by the trusted issuer Android Telephony, and (3) other validity
# properties associated with this credential, such as issue time and expiration
# time
# In most cases, you can use an SD-JWT VC library to perform these validations.
# Some aggregators may also perform the validation logic for you. Check with your
# aggregator to decide the exact scope of the validation required.
تعویض با شماره تلفن
برای تأیید اعتبار و دریافت شماره تلفن تأیید شده، از پشتیبان برنامه خود، TS.43 Digital Credential
به نقطه پایانی جمعآورنده ارسال کنید.
def processDigitalCredentialsResponse(response):
# ... prior steps
# Step 3: Call aggregator endpoint to exchange the verified phone number
callAggregatorPnvEndpoint(ts43_digital_credential)