Node.js

Vonage Client SDKを使用します。

Androidアプリに check_url モバイル・ネットワークを使って code を経由してバックエンドに戻る。 /check-code.

を使うのではなく OkHttp を呼び出す check_urlサイレント認証はモバイル・ネットワークのコンテキスト(キャリア・ルーティング、SIM/ネットワーク・アイデンティティ)に依存し、リクエストがWi-Fiを経由する可能性があるため、Vonage Client SDKを使用します。

Vonage Client SDKはまさにこれを解決するために存在します:

  • セルラーデータを使ったリクエストを強制することができる(または正しいネットワークルートを使う)。
  • Silent Authが期待する方法で、リダイレクトとリクエストの詳細を処理する。
  • 構造化された応答が得られるので、それを抽出することができる。 code すっきり

このセクションでは、次のようなものを作っている:

  1. もし check_url が存在する場合は、Vonage Client SDKを使用して電話から呼び出します。
  2. 抜粋 code 応答から
  3. 送信 { request_id, code } を経由してバックエンドに送られる。 /check-code.
  4. Silent Authに失敗した場合は、SMSにフォールバックする:
    • コール /next (ベストエフォートなので、〜20秒も待たない)。
    • SMSコードのUIを表示する。

Vonage Client SDKの依存関係の追加

依存関係を現在のプロジェクトに追加する。あなたの build.gradle.kts と付け加える:

implementation 'com.vonage:client-library:1.0.1'

追加したら、Gradleを同期させる。

SDKの初期化

で一度SDKを初期化する。 MainActivity.onCreate():

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Needed for Silent Auth cellular requests
        VGCellularRequestClient.initializeSdk(this.applicationContext)

        setContent { VerifyApp() }
    }
}

これは起動時に行うのが安全で、後で忘れるのを防ぐことができる。

実施 checkSilentAuth(checkUrl) SDKの使用

この関数を MainActivity.kt..へのセルラーGETリクエストを実行します。 check_urlリダイレクト、抽出 code をJSONレスポンスから取得する。

import com.vonage.clientlibrary.VGCellularRequestClient
import com.vonage.clientlibrary.VGCellularRequestParameters
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.IOException

private suspend fun checkSilentAuth(url: String): String = withContext(Dispatchers.IO) {
    val params = VGCellularRequestParameters(
        url = url,
        headers = mapOf(),
        queryParameters = mapOf(),
        maxRedirectCount = 10
    )

    val response = VGCellularRequestClient.getInstance()
        .startCellularGetRequest(params, false)

    val httpStatus = response.optInt("http_status", -1)
    val sdkError = response.optString("error", "")

    if (sdkError.isNotEmpty()) {
        throw IOException("Silent Auth SDK error: $sdkError")
    }

    if (httpStatus !in 200..299) {
        val rawBody = response.optString("response_raw_body", "")
        throw IOException("Silent Auth failed: HTTP $httpStatus - ${rawBody.take(200)}")
    }

    val bodyJsonObj = response.optJSONObject("response_body")
    val code = bodyJsonObj?.optString("code", null)

    if (code.isNullOrBlank()) {
        throw IOException("Silent Auth response missing 'code'")
    }

    code
}

このメソッドは code バックエンドが POST /check-code.

検証開始」フローを更新し、サイレント認証を試みる

ここで、前のセクションの「常にSMSフォールバックを強制する」ロジックを次のように置き換える:

  • サイレント認証を試す check_url ある
  • 失敗したら /next (ベストエフォート)とSMS UIの表示

概念的にだ:

  1. POST /verification(request_id, check_url?)

  2. もし check_url が存在する:

    • code = checkSilentAuth(check_url)
    • POST /check-code(request_id, code)
  3. もしそれが失敗したら

    • コール POST /next (オプションでUX最適化)
    • SMSのUIを表示

以下は、メール作成ボタン内で使用する核となる部分です。 onClick (コルーチン内):

val start = startVerification(phone)
val requestId = start.requestId
val checkUrl = start.checkUrl

if (!checkUrl.isNullOrBlank()) {
    statusMessage = "Attempting Silent Authentication..."

    try {
        val codeFromSa = checkSilentAuth(checkUrl)
        val result = submitCode(requestId, codeFromSa)

        if (result.verified) {
            uiState = VerifyUiState.Verified("Silent Authentication")
            statusMessage = "Verified via Silent Authentication"
        } else {
            // Silent Auth did not complete successfully
            uiState = VerifyUiState.EnterSms(requestId)
            statusMessage = "Silent Auth didn't complete. Please enter the SMS code."
        }
    } catch (e: Exception) {
        // Silent Auth failed quickly: force fallback so we don't wait ~20 seconds
        statusMessage = "Silent Auth failed. Please enter the SMS code."

        try {
            requestNextWorkflow(requestId)
        } catch (fallbackError: Exception) {
            // Ignore fallback error, just proceed to SMS
        }

        uiState = VerifyUiState.EnterSms(requestId)
    }
} else {
    // No check_url: Silent Auth not available. Go straight to SMS.
    uiState = VerifyUiState.EnterSms(requestId)
    statusMessage = "Silent Authentication is not available. Please enter the SMS code."
}
Verify and Silent Auth Tutorial