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
Closed
feat(ios): apple sign-in de producción en el demo y contrato correcto para Swift#14rndevelo wants to merge 2 commits into
rndevelo wants to merge 2 commits into
Conversation
… 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.
Contributor
|
Integrada en |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
ASAuthorizationControllery presentación desde laescena en primer plano.
Del lado de Kotlin, el KDoc de los seis providers de iOS decía
.companiondonde Kotlin/Nativeexporta
.shared. Los ejemplos que la librería publicaba no compilaban. Corregido en los seisy en las siete apariciones del README.
Por qué importa el nonce y el nombre
idToken: el flujo se cae en el último paso, que es el más carode diagnosticar.
persiste ahí, se pierde para siempre. De ahí el segmento
displayNamedel 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.mdva 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