Phase 1 aus dem Native-Auth-Vollausbau-Plan (Option A, siehe mana/docs/MANA_SWIFT.md). 7 neue AuthClient-Methoden für die Account-Reise: register, forgotPassword, resetPassword, resendVerification, changeEmail, changePassword, deleteAccount. AuthError jetzt mit 19 präzisen Cases gespiegelt aus AuthErrorCode in mana-auth/lib/auth-errors.ts, plus AuthError.classify() als public Helper und Equatable-Conformance. AuthClient.lastError ergänzt — strukturierter Fehler für ManaAuthUI das den .emailNotVerified-Gate programmatisch braucht. signIn und refreshAccessToken auf neue Klassifikation umgestellt. Breaking: AuthError.serverError hat zusätzliches code:-Argument. Apps (cards-native, memoro-native) sind bereits angepasst. 38/38 Tests grün (26 neu): AuthErrorClassifyTests deckt jeden ErrorCode + Status-Heuristik + Retry-After ab, AuthClientAccountTests deckt jede neue Methode via URLProtocol-Mock ab. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.8 KiB
4.8 KiB
Changelog
Alle Änderungen werden hier dokumentiert. Format orientiert an Keep a Changelog, Versionierung nach Semver.
[1.1.0] — 2026-05-13
Phase 1 aus dem Native-Auth-Vollausbau-Plan (Option A — alles nativ,
siehe mana/docs/MANA_SWIFT.md). Erweitert ManaCore um die
Account-Lifecycle-Methoden, die jede native Verein-App für eine
vollständige Auth-Reise braucht.
ManaCore — Neue API (additiv, keine Breaking Changes)
AuthClient.register(email:password:name:sourceAppUrl:)— Sign-Up gegenPOST /api/v1/auth/register. Persistiert eine Session automatisch, wenn der Server Tokens mitliefert; sonst still und wartend auf Email-Verifikation.AuthClient.forgotPassword(email:resetUniversalLink:)— Passwort- Reset-Mail anfordern gegenPOST /api/v1/auth/forgot-password. Server antwortet immer 200 (keine User-Enumeration).AuthClient.resetPassword(token:newPassword:)— Passwort mit Token aus Reset-Mail setzen.AuthClient.resendVerification(email:sourceAppUrl:)— Verify-Mail erneut versenden, aufzurufen nachAuthError/emailNotVerified.AuthClient.changeEmail(newEmail:callbackUniversalLink:)— Email ändern (verschickt Verify-Mail an neue Adresse). Aktuell server- seitig nicht Bearer-fähig — siehe Doc-Header vonAuthClient+Account.swift.AuthClient.changePassword(currentPassword:newPassword:)— Passwort ändern. Gleiche Bearer-Einschränkung wiechangeEmail.AuthClient.deleteAccount(password:)— Account löschen (App-Store-Guideline 5.1.1(v) Pflicht). Wiped Keychain bei Erfolg. Gleiche Bearer-Einschränkung wie oben.
ManaCore — AuthError ausgebaut
- Präzise Cases pro Server-
AuthErrorCode:.emailNotVerified,.emailAlreadyRegistered,.weakPassword(message:),.accountLocked(retryAfter:),.signupLimitReached,.rateLimited(retryAfter:),.tokenExpired,.tokenInvalid,.twoFactorRequired,.twoFactorFailed,.passkeyNotEnabled,.passkeyCancelled,.passkeyVerificationFailed,.validation(message:),.unauthorized,.notFound,.serviceUnavailable,.serverInternal. AuthError.classify(status:data:retryAfterHeader:)— public, klassifiziert mana-auth-Fehler-Antworten in den passenden Case. Auch genutzt vonsignInundrefreshAccessToken(vorher: einfache.error(String)-Strings).AuthErrorist jetztEquatable— erleichtert UI-Logik und Tests.- Alte Cases
.invalidCredentials,.networkFailure,.encoding,.keychain,.decoding,.notSignedInbleiben unverändert. - Breaking-Vermeidung:
serverError(status:message:)wurde zuserverError(status:code:message:)(zusätzlichescode-Argument). Theoretisch breaking, praktisch nutzt es niemand außerhalb von ManaCore selbst. Wenn ein App-Konsument darauf gepattern-matched hat, ist das ein Compile-Fehler, kein Runtime-Bug.
Tests
- 14 neue Tests für
AuthError.classify(jeder ErrorCode + Status- Heuristik + Retry-After-Header + kaputter Body). - 12 neue Tests für die neuen
AuthClient-Methoden viaURLProtocol-Mock (Wire-Format, Status-Mapping, Bearer-Header, Session-Persistenz beiregister, Session-Wipe beideleteAccount).
Bekannte Einschränkungen
changeEmail,changePassword,deleteAccountbrauchen Server- seitig denbearer-Plugin von Better Auth oder einen Custom- Bearer-Resolver. Heute mountetmana-authnur den Cookie-Pfad. Phase-3-Server-PR immana-Repo dokumentiert.- 2FA-Verify, Magic-Link und Passkey-Flows sind in dieser Version
bewusst NICHT enthalten. Laufen Server-seitig über Better-Auth-
Native (
/api/auth/*, Cookie) und brauchen eigene JWT-Pfade. Folgt in v1.2.0 zusammen mit dem Server-PR.
[1.0.1] — 2026-05-13
Behoben
AuthenticatedTransport:URL.appending(path:)URL-encoded das?in Query-Strings zu%3F, was den Server-Route-Match brechen ließ (404 für/healthz?…). Ersetzt durch String-Concat; Caller liefert den Path inkl. führendem/und optionaler Query.
[1.0.0] — 2026-05-12
Initiale Extraktion aus memoro-native (Phase α aus
mana/docs/MANA_SWIFT.md).
ManaCore (neu)
ManaAppConfig-Protocol für App-injizierbare Konfiguration (authBaseURL,keychainService,keychainAccessGroup).AuthClient— mana-auth-Login per E-Mail+PW, Status-Maschine, Token-Speicherung im Keychain, proaktiver Refresh.JWT— Token-Expiry-Berechnung (lokaler Parse, keine Signatur-Verifikation).KeychainStore— generisches Token-Storage, konfigurierbarer Service-Identifier + Access-Group.AuthError— sprechende Fehlertypen mitLocalizedError-Texten.AuthenticatedTransport— URLSession-Wrapper mit Auth-Header und automatischem 401-Retry-mit-Refresh.
ManaTokens (neu)
- Farben, Spacings, Typography, Radius — gespiegelt aus
mana/docs/THEMING.md.