Vonage Client SDKを使用します。
Androidアプリに check_url モバイル・ネットワークを使って code を経由してバックエンドに戻る。 /check-code.
を使うのではなく OkHttp を呼び出す check_urlサイレント認証はモバイル・ネットワークのコンテキスト(キャリア・ルーティング、SIM/ネットワーク・アイデンティティ)に依存し、リクエストがWi-Fiを経由する可能性があるため、Vonage Client SDKを使用します。
Vonage Client SDKはまさにこれを解決するために存在します:
- セルラーデータを使ったリクエストを強制することができる(または正しいネットワークルートを使う)。
- Silent Authが期待する方法で、リダイレクトとリクエストの詳細を処理する。
- 構造化された応答が得られるので、それを抽出することができる。
codeすっきり
このセクションでは、次のようなものを作っている:
- もし
check_urlが存在する場合は、Vonage Client SDKを使用して電話から呼び出します。 - 抜粋
code応答から - 送信
{ request_id, code }を経由してバックエンドに送られる。/check-code. - 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の表示
概念的にだ:
POST /verification→(request_id, check_url?)もし
check_urlが存在する:code = checkSilentAuth(check_url)POST /check-codeと(request_id, code)
もしそれが失敗したら
- コール
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."
}

サイレント認証を始める
サイレント認証を理解するにはかなりの時間がかかる。このチュートリアルでは、NodejsとKotlinを使って統合をゼロから構築する方法を紹介する。