← Volver al Inicio
🎵PROVIWEB Connect · Guía de Integración SSO
👑 Consola Admin (Marcas/Terceros)
SINGLE SIGN-ON / OAUTH 2.0

Iniciar Sesión con PROVIWEB en Otras Aplicaciones

Permite que tus aplicaciones satélite (com.israviolink.app, com.israviolink.admin, com.israviolink.nunti y com.israviolink.pulso) inicien sesión de forma segura y centralizada con la cuenta de artista de PROVIWEB.

🔐

🎨 1. Botones Oficiales "Iniciar Sesión con PROVIWEB"

Integra el botón oficial en tu aplicación para garantizar una identidad visual coherente y reconocible:

Iniciar Sesión con PROVIWEB Iniciar Sesión con PROVIWEB
HTML del botón:
<!-- code_challenge is SHA-256(code_verifier), Base64 URL-safe, no padding -->
<a href="https://proviweb.com/oauth-authorize.html?client_id=com.israviolink.pulso&redirect_uri=proviweb-pulso://oauth/callback&scope=profile+email+qav&response_type=code&code_challenge={S256_CHALLENGE}&code_challenge_method=S256&state={RANDOM_STATE}" class="proviweb-sso-btn">
    <img src="proviweb_logo.png" style="width:22px; height:22px;">
    <span>Iniciar Sesión con PROVIWEB</span>
</a>
Configuración oficial de paquetes Android:
com.israviolink.app   -> proviweb://oauth/callback/app
com.israviolink.admin -> israviolink-admin://oauth/callback
com.israviolink.nunti -> israviolink-nunti://oauth/callback
com.israviolink.pulso -> proviweb-pulso://oauth/callback

🌍 2. Integración para terceros (apps y sitios web)

Sí, PROVIWEB Connect puede usarse como botón de inicio de sesión para apps y plataformas externas. El cliente debe registrarse primero en la consola admin para quedar autorizado.

Flujo recomendado para terceros:
1) Registrar client_id y redirect_uri en la consola OAuth de PROVIWEB (admin.html).
2) Lanzar /oauth-authorize.html con response_type=code + scope + PKCE S256.
3) Usuario inicia sesión en PROVIWEB y aprueba permisos explícitamente.
4) Recibir ?code=... en el callback del tercero.
5) Canjear el code en POST /oauth/token con code_verifier.
6) Iniciar sesión en el sistema del tercero con custom_token (Firebase Auth).
Ejemplo para sitio web tercero (redirect_uri HTTPS):
https://proviweb.com/oauth-authorize.html
?client_id=mi.sitio.web
&redirect_uri=https://mi-dominio.com/oauth/proviweb/callback
&response_type=code
&scope=profile+email+qav
&code_challenge={S256_CHALLENGE}
&code_challenge_method=S256
&state={RANDOM_STATE}

📱 3. Integración en Android (Ej: com.israviolink.pulso)

En tu aplicación Android nativa, puedes abrir el portal de autorización con Chrome Custom Tabs para una experiencia fluida y recibir el código mediante un Deep Link.

Paso A: Declarar el Deep Link en AndroidManifest.xml

<activity android:name=".OAuthCallbackActivity" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Deep link: proviweb-pulso://oauth/callback -->
        <data android:scheme="proviweb-pulso" android:host="oauth" android:path="/callback" />
    </intent-filter>
</activity>

Paso B: Lanzar la pantalla de autorización (Kotlin)

// Generate one verifier/state pair per login and keep both in encrypted local storage.
val codeVerifier = createRandomUrlSafeString(64) // RFC 7636: 43-128 chars
val codeChallenge = sha256Base64Url(codeVerifier)
val state = UUID.randomUUID().toString()
savePendingOAuth(state, codeVerifier)

val authUrl = "https://proviweb.com/oauth-authorize.html?" +
    "client_id=com.israviolink.pulso&" +
    "redirect_uri=proviweb-pulso://oauth/callback&" +
    "response_type=code&scope=profile+email+qav&" +
    "code_challenge=" + Uri.encode(codeChallenge) + "&" +
    "code_challenge_method=S256&state=" + Uri.encode(state)

CustomTabsIntent.Builder().build().launchUrl(context, Uri.parse(authUrl))

Paso C: Recibir el código e iniciar sesión

// En OAuthCallbackActivity.kt:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val uri = intent?.data
    val code = uri?.getQueryParameter("code")
    val state = uri?.getQueryParameter("state")

    if (code != null) {
        // Canjear código con la Cloud Function oauthTokenExchange
        val pending = loadPendingOAuth() ?: return finish()
        if (state == null || state != pending.state) return finish() // Reject CSRF/mismatched callback.

        Firebase.functions("us-central1").getHttpsCallable("oauthTokenExchange")
            .call(mapOf(
                "code" to code,
                "clientId" to "com.israviolink.pulso",
                "codeVerifier" to pending.codeVerifier
            ))
            .addOnSuccessListener { result ->
                val customToken = (result.data as Map<*, *>)["customToken"] as String
                FirebaseAuth.getInstance().signInWithCustomToken(customToken)
                clearPendingOAuth()
            }
    }
}

🧪 4. Probador & Simulador Interactivo de Autorización

Prueba el flujo de autorización en vivo directamente desde tu navegador: