diff --git a/README.md b/README.md index d4f4eaa..35a2a5c 100644 --- a/README.md +++ b/README.md @@ -88,4 +88,27 @@ app/ ``` ## Contribución -Si deseas contribuir, crea una rama, realiza tus cambios y abre un pull request. \ No newline at end of file +Si deseas contribuir, crea una rama, realiza tus cambios y abre un pull request. + +## Flujo de autenticación con Google (actual) + +### Objetivo +- Mantener un acceso de “un toque” para usuarios Google en Appwrite usando credenciales de email/password por detrás. +- Permitir que cualquier usuario cambie su contraseña sin romper su cuenta. + +### Reglas del flujo +1. **Default Google**: + - `email` de la cuenta Appwrite = email de Google. + - `password` inicial = `sub` de Google. + - En `prefs` se guarda `sub` (`prefs.sub = sub`) junto al resto de metadatos. +2. **Cambio de contraseña**: + - El usuario puede cambiar su contraseña libremente. + - El `sub` se mantiene en `prefs`; no se elimina. +3. **Google one-tap**: + - Funciona directamente mientras la contraseña actual siga siendo el `sub`. +4. **Fallback (Opción A)**: + - Si el login one-tap falla porque el usuario ya cambió su contraseña, se muestra un mensaje guiando a iniciar una vez con correo+contraseña para continuar usando Google. + +### Detalle técnico del fallback +- En error de autenticación Google (`401`) se intenta alta automática. +- Si la alta responde `409` (cuenta ya existe), se interpreta como posible contraseña cambiada y se devuelve el mensaje de recuperación con login tradicional una vez. diff --git a/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/AuthWithGoogleCaseUse.kt b/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/AuthWithGoogleCaseUse.kt index bb46558..a0b154c 100644 --- a/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/AuthWithGoogleCaseUse.kt +++ b/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/AuthWithGoogleCaseUse.kt @@ -1,7 +1,6 @@ package com.elitec.alejotaller.feature.auth.domain.caseuse import android.content.Context -import com.elitec.alejotaller.feature.auth.domain.caseuse.util.hashEmailWithSub import com.elitec.alejotaller.feature.auth.domain.entity.UserProfile import com.elitec.alejotaller.feature.auth.domain.ports.GoogleAuthProvider import com.elitec.alejotaller.feature.auth.domain.ports.SessionManager @@ -16,11 +15,7 @@ class AuthWithGoogleCaseUse( ) { suspend operator fun invoke(context: Context): Result = runCatching { val googleUser = googleAuthProvider.getUser(context) - - val password = hashEmailWithSub( - email = googleUser.email, - sub = googleUser.sub - ) + val password = googleUser.sub runCatching { sessionManager.closeCurrentSession() } @@ -31,11 +26,22 @@ class AuthWithGoogleCaseUse( when(e.code) { 401 -> { - val userId =registerCaseUse( - email = googleUser.email, - password = password, - name = googleUser.name - ).getOrElse { throw it } + val userId = try { + registerCaseUse( + email = googleUser.email, + password = password, + name = googleUser.name + ).getOrElse { throw it } + } catch (registerError: Exception) { + val appwriteError = registerError as? AppwriteException + if (appwriteError?.code == 409) { + throw IllegalStateException( + "Tu contraseña fue cambiada. " + + "Inicia una vez con correo y contraseña para continuar con Google." + ) + } + throw registerError + } accountRepository.updateProfile( UserProfile( @@ -46,18 +52,9 @@ class AuthWithGoogleCaseUse( ) ) userId - accountRepository.updateProfile( - UserProfile( - sub = googleUser.sub, - phone = googleUser.phone, - photoUrl = googleUser.photoUrl, - verification = false - ) - ) - userId } else -> throw e } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/RegisterWithGoogleUseCase.kt b/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/RegisterWithGoogleUseCase.kt index 4e7f4f7..680fba9 100644 --- a/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/RegisterWithGoogleUseCase.kt +++ b/app/src/main/java/com/elitec/alejotaller/feature/auth/domain/caseuse/RegisterWithGoogleUseCase.kt @@ -1,7 +1,6 @@ package com.elitec.alejotaller.feature.auth.domain.caseuse import android.content.Context -import com.elitec.alejotaller.feature.auth.domain.caseuse.util.hashEmailWithSub import com.elitec.alejotaller.feature.auth.domain.entity.User import com.elitec.alejotaller.feature.auth.domain.entity.UserProfile import com.elitec.alejotaller.feature.auth.domain.repositories.AccountRepository @@ -18,10 +17,7 @@ class RegisterWithGoogleUseCase( val googleUser = googleAuthProvider.getUser(context) - val password = hashEmailWithSub( - email = googleUser.email, - sub = googleUser.sub - ) + val password = googleUser.sub val userProfile = UserProfile( sub = googleUser.sub, @@ -46,4 +42,4 @@ class RegisterWithGoogleUseCase( googleUser.email } -} \ No newline at end of file +}