شماره تلفن را با اعتبار دیجیتال تأیید کنید

این راهنما نحوه استفاده از API اعتبارسنجی دیجیتال (DigitalCredential API) را برای دریافت شماره تلفن‌های تأیید شده برای کاربران شما شرح می‌دهد. این فرآیند شامل دو مرحله است:

  1. درخواست TS.43 token : برنامه کلاینت شما ("تأییدکننده") یک توکن موقت TS.43 را از دستگاه کاربر درخواست می‌کند. TS.43 token یک اعتبارنامه صادر شده توسط اپراتور است که هویت کاربر را نشان می‌دهد.
  2. توکن را با شماره تلفن مبادله کنید : بک‌اند برنامه شما TS.43 token را با یک تجمیع‌کننده یا یک اپراتور برای شماره تلفن تأیید شده کاربر مبادله می‌کند.

سازگاری با نسخه اندروید

API تأیید شماره تلفن در اندروید ۱۰ (سطح API ۲۹) و بالاتر پشتیبانی می‌شود.

پیش‌نیازها

برای پیاده‌سازی تأیید شماره تلفن با API دیجیتال اعتبارسنجی (DigitalCredential API)، به یک حساب کاربری در یک تجمیع‌کننده نیاز دارید. یک تجمیع‌کننده با اپراتورها تعامل دارد و سطح API لازم را برای برنامه شما فراهم می‌کند، که معمولاً به عنوان یک نقطه پایانی API ابری قابل پرداخت است.

همچنین باید وابستگی‌های زیر را به اسکریپت ساخت Gradle خود اضافه کنید:

کاتلین

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-rc02")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-rc02")
}

شیار

dependencies {
    implementation "androidx.credentials:credentials:1.6.0-rc02"
    implementation "androidx.credentials:credentials-play-services-auth:1.6.0-rc02"
}

پیاده‌سازی

فرآیند از ابتدا تا انتها به طور کلی مراحل زیر را دنبال می‌کند:

  1. درخواست پارامترهای DCQL (زبان جستجوی اعتبارنامه دیجیتال) از یک تجمیع‌کننده : با یک یا چند تجمیع‌کننده تماس بگیرید و مجموعه‌ای از پارامترهای DCQL را درخواست کنید. DCQL به شما امکان می‌دهد اعتبارنامه‌های دیجیتالی دقیقی را که از هر تجمیع‌کننده نیاز دارید، مشخص کنید.
  2. ایجاد درخواست OpenID4VP : از طریق backend برنامه خود، درخواست OpenID4VP را ایجاد کنید، در حالی که پارامترهای DCQL را از aggregator اضافه می‌کنید. سپس، درخواست OpenID4VP را به برنامه کلاینت خود ارسال کنید.

  3. فراخوانی رابط برنامه‌نویسی مدیریت اعتبارنامه (Credential Manager API) : در برنامه‌ی کلاینت خود، از رابط برنامه‌نویسی کاربردی مدیریت اعتبارنامه (Credential Manager API) برای ارسال درخواست OpenID4VP به سیستم عامل استفاده کنید. در پاسخ، یک شیء پاسخ OpenID4VP حاوی TS.43 Digital Credential دریافت می‌کنید. این اعتبارنامه رمزگذاری شده است و فقط توسط تجمیع‌کننده‌ی مرتبط قابل رمزگشایی است. پس از دریافت توکن حامل، پاسخ را از برنامه‌ی کلاینت خود به بک‌اند برنامه ارسال کنید.

  4. اعتبارسنجی پاسخ : در بک‌اند برنامه خود، پاسخ OpenID4VP را اعتبارسنجی کنید.

  5. تبادل شماره تلفن : از بک‌اند برنامه خود، TS.43 Digital Credential را به تجمیع‌کننده ارسال کنید. تجمیع‌کننده اعتبارنامه را اعتبارسنجی کرده و شماره تلفن تأیید شده را برمی‌گرداند.

تصویری که روند درخواست تأیید شماره تلفن را نشان می‌دهد
شکل ۱. طول عمر یک درخواست تأیید شماره تلفن، که از بخش پشتی تأییدکننده شروع می‌شود و پارامترها را از یک تجمیع‌کننده درخواست می‌کند و با یک شماره تلفن تأیید شده بازگردانده شده پایان می‌یابد.

درخواست پارامترهای DCQL از یک تجمیع‌کننده

از بک‌اند برنامه خود، درخواستی برای شیء اعتبارنامه زبان پرس‌وجوی اعتبارنامه دیجیتال (DCQL) به تجمیع‌کننده ارسال کنید. حتماً در درخواست خود یک nonce و یک شناسه درخواست ارائه دهید. تجمیع‌کننده شیء اعتبارنامه 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 را ایجاد کنید

ابتدا، از backend برنامه خود، با قرار دادن شیء اعتبارنامه DCQL در یک آرایه credentials که درون یک شیء dcql_query تو در تو قرار دارد، همانطور که در مثال زیر نشان داده شده است، یک شیء 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 : یک مقدار منحصر به فرد که توسط backend شما برای هر درخواست تولید می‌شود. nonce موجود در شیء اعتبارنامه DCQL تجمیع‌کننده باید با این nonce مطابقت داشته باشد.
  • dcql_query : در این مورد، از dcql_query برای مشخص کردن اینکه یک TS.43 Digital Credential درخواست می‌شود، استفاده کنید. همچنین می‌توانید اعتبارنامه‌های دیجیتال دیگری را نیز در اینجا درخواست کنید.

سپس، درخواست OpenID4VP را در یک شیء درخواست API مربوط به DigitalCredential قرار دهید و آن را به برنامه کلاینت ارسال کنید.

{
  "requests":
    [
      {
        "protocol": "openid4vp-v1-unsigned",
        "data": {
          "response_type": "vp_token",
          "response_mode": "dc_api",
          "nonce": "...",
          "dcql_query": { ... }
        }
      }
    ]
}

قطعه کد زیر نحوه تولید درخواست API مربوط به DigitalCredential را نشان می‌دهد:

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

فراخوانی API مدیریت اعتبارنامه

در برنامه‌ی کلاینت خود، با درخواست API مربوط به DigitalCredential که توسط backend برنامه‌تان ارائه شده است، رابط برنامه‌نویسی مدیریت اعتبار (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)
  }
}

پاسخ API مربوط به DigitalCredential شامل پاسخ OpenID4VP است. یک json معمولی از نتیجه DigitalCredential به شرح زیر است:

{
  "protocol": "openid4vp-v1-unsigned",

  "data": {
    "vp_token": {
      "aggregator1": ["eyJhbGciOiAiRVMy..."] # The encrypted TS.43 Digital
                                             # Credential in an array structure.
    }
  }
}

از برنامه کلاینت خود، پاسخ API مربوط به DigitalCredential را به سرور backend ارسال کنید، جایی که می‌تواند اعتبارسنجی شود و برای تبادل شماره تلفن تأیید شده با یک تجمیع‌کننده استفاده شود.

اعتبارسنجی پاسخ اعتبارنامه دیجیتال

در ادامه مثالی از نحوه تجزیه پاسخ و انجام مرحله اعتبارسنجی در backend برنامه شما آمده است:

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)