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:
<!-- 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>
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.
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).
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: