Node.js

Utiliza el Vonage Client SDK

Es hora de completar correctamente la autenticación silenciosa haciendo que la aplicación de Android llame a la check_url utilizando la red móvil y enviando el code de vuelta al backend a través de /check-code.

En lugar de utilizar OkHttp llamar check_urlEn este caso, utilizaremos el Client SDK de Vonage porque la autenticación silenciosa depende del contexto de la red móvil (enrutamiento del operador, identidad de la SIM/red), y la solicitud puede ir a través de Wi-Fi, lo que rompe el propósito de la autenticación silenciosa.

El Vonage Client SDK existe para resolver exactamente esto:

  • Puede forzar que la solicitud se realice a través de datos móviles (o utilizar la ruta de red correcta)
  • Gestiona las redirecciones y los detalles de las solicitudes tal y como espera Silent Auth
  • Te da una respuesta estructurada para que puedas extraer la code limpiamente

En esta sección vamos a crear lo siguiente:

  1. Si check_url existe, llámalo desde el teléfono usando el Vonage Client SDK.
  2. Extracto code según la respuesta.
  3. Enviar { request_id, code } al backend a través de /check-code.
  4. Si falla la autenticación silenciosa, recurre al SMS:
    • llame a /next (se hará todo lo posible para no tener que esperar unos 20 segundos).
    • mostrar la interfaz de usuario del código SMS.

Añade la dependencia de Vonage Client SDK

Añade la dependencia al proyecto actual. Abra su build.gradle.kts y añade:

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

Después de añadirlo, sincroniza Gradle.

Inicializar el SDK

Inicializa el SDK una vez en 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() }
    }
}

Esto es seguro hacerlo al inicio y evita olvidarlo más tarde.

Implementar checkSilentAuth(checkUrl) Uso del SDK

Añada esta función a su MainActivity.kt.. Realiza una petición GET celular a check_url, sigue las redirecciones y extrae code de la respuesta 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
}

El método devuelve un code que su backend puede validar con POST /check-code.

Actualizar el flujo "Iniciar verificación" para intentar la autenticación silenciosa

Ahora sustituye la lógica de "forzar siempre el SMS fallback" de la sección anterior por:

  • Prueba «Silent Auth» si check_url está presente
  • Si falla, activa /next (según disponibilidad) y mostrar la interfaz de usuario de SMS

Desde el punto de vista conceptual:

  1. POST /verification(request_id, check_url?)

  2. Si check_url existe:

    • code = checkSilentAuth(check_url)
    • POST /check-code con (request_id, code)
  3. Si eso no funciona:

    • llame a POST /next (optimización de la experiencia de usuario opcional)
    • mostrar interfaz SMS

Esta es la parte principal que debes incluir dentro de tu botón «Compose» onClick (dentro de una corrutina):

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