Skip to content

feat(ios): apple sign-in de producción en el demo y contrato correcto para Swift - #14

Closed
rndevelo wants to merge 2 commits into
developfrom
feature/003-apple-signin-production
Closed

feat(ios): apple sign-in de producción en el demo y contrato correcto para Swift#14
rndevelo wants to merge 2 commits into
developfrom
feature/003-apple-signin-production

Conversation

@rndevelo

Copy link
Copy Markdown
Collaborator

Primero de una tanda de nueve. Se mergean en orden: 003 → 004 → … → 011.

Qué

AppleSignInCoordinator.swift: implementación de referencia de Sign in with Apple para el demo,
con nonce SHA-256, retención explícita del ASAuthorizationController y presentación desde la
escena en primer plano.

Del lado de Kotlin, el KDoc de los seis providers de iOS decía .companion donde Kotlin/Native
exporta .shared. Los ejemplos que la librería publicaba no compilaban. Corregido en los seis
y en las siete apariciones del README.

Por qué importa el nonce y el nombre

  • Sin nonce, Firebase rechaza el idToken: el flujo se cae en el último paso, que es el más caro
    de diagnosticar.
  • Apple manda el nombre completo solo en la primera autorización de cada usuario. Si no se
    persiste ahí, se pierde para siempre. De ahí el segmento displayName del token empaquetado,
    que se añade al formato de dos segmentos en vez de sustituirlo, para no romper a nadie.

Qué falta

Smoke en Mac: login con Apple en un dispositivo real, y comprobar que el nombre llega en el primer
login y no en los siguientes.

specs/003-apple-signin-production/spec.md va en esta rama (escrito a posteriori).

Verificado en Windows: :custom-login:ktlintCheck + :custom-login:testDebugUnitTest (254 tests, 0 fallos). El Swift de esta rama no se ha compilado nunca: pendiente de Mac.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E41idMYhfgBSz2EeuNUn5Q

rndevelo and others added 2 commits August 14, 2026 02:52
… para Swift

Apple era el único provider con entitlement en el demo y sin una sola línea de
Swift: el botón solo registraba un warning y devolvía null. Se añade
AppleSignInCoordinator, que es la implementación de referencia que el README
manda copiar, y cierra los cuatro fallos que solo aparecen en runtime:

- nonce con SecRandomCopyBytes comprobando el OSStatus, abortando en vez de caer
  a un valor predecible; si falta el nonce en el delegate se rechaza el token en
  lugar de firmar sin protección de replay;
- referencia fuerte al ASAuthorizationController, que el sistema no retiene y sin
  la cual la hoja no llega a aparecer;
- un único finish(), de modo que la completion de Kotlin se llama exactamente una
  vez en todos los caminos, cancelación incluida — si no, la corrutina no reanuda
  y el botón se queda girando para siempre;
- el fullName, que Apple manda solo en la PRIMERA autorización de cada usuario,
  viaja en el segmento |||displayName||| que applyPendingDisplayName persiste.

El KDoc de AppleSignInProviderIOS es el contrato de integración y enseñaba Swift
que no compila: `.companion` sobre un `object` no existe, solo lo tiene el
companion de una clase (GoogleSignInProviderIOS). El mismo error estaba en los
otros cinco providers, así que se corrige en todos.

Logger.ios.kt pasaba el mensaje ya interpolado como format string de NSLog. Está
justo en la ruta de error de Apple, y un `%` en el mensaje —las URLs
percent-encoded de OAuth los llevan— lee memoria arbitraria de los varargs.

Sin cambios en commonMain: la API pública y los cinco tests de FLE-90 sobre el
formato de token de Apple quedan intactos. Verificado ktlintCheck y
testDebugUnitTest; el lado Swift no es compilable desde Windows y queda pendiente
de xcodebuild en Mac.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rkh7MzVRj5iXT2rLiqyW6A
…cción

Mismo motivo que el 004: se implementó como fix directo y el spec se escribe
después. Recoge las cuatro formas de romper Apple Sign-In que solo se ven en
runtime, por qué .companion no compilaba sobre un object —y por qué el único
ejemplo correcto era justo el que alguien había ejecutado— y una trazabilidad que
dice sin rodeos que ningún AC nuevo es unitario.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rkh7MzVRj5iXT2rLiqyW6A
hgarciaalberto pushed a commit that referenced this pull request Aug 19, 2026
…21)

Cierra de una vez la pila 003→010, que estaba encadenada PR sobre PR. Sustituye a #14, #15,
#16, #17, #18, #19 y #20.

- 003 Apple Sign-In de producción en el demo y contrato correcto para Swift
- 004 Cablea GitHub, Microsoft, Twitter, Facebook y teléfono en el demo (+ su spec)
- 005 Revoca el token de Apple antes de borrar la cuenta
- 006 Cierra también la sesión de GoogleSignIn al salir, en iOS
- 007 Pasa los scopes de AppleSignInConfig al handler de iOS
- 008 Fija el bundle id de iOS y alinea el magic link
- 009 Sesión de teléfono completa y testeable en las dos plataformas
- 010 Documenta lo que falta para construir el demo y deprecar código muerto

Las ocho PRs intermedias apuntaban cada una a la rama de la anterior, y el CI solo disparaba
en PRs contra develop/main, así que ninguna había pasado un check. Eso lo arregló #23. Esta
pila se validó entera antes de entrar: ambos jobs en verde.
@hgarciaalberto

Copy link
Copy Markdown
Contributor

Integrada en develop vía #21, que agrupó la pila 003→010 en un único squash en vez de encadenar ocho merges con su rebase detrás. El código de esta PR está en develop; se cierra sin mergear porque el commit ya no existe con este SHA.

@hgarciaalberto
hgarciaalberto deleted the feature/003-apple-signin-production branch August 19, 2026 22:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants