From d4cff490c47ffdab07e843529d3e0879913ee446 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 18 May 2026 16:12:32 +0200 Subject: [PATCH] =?UTF-8?q?feat(auth):=20ManaSharedKeychainGroup=20f=C3=BC?= =?UTF-8?q?r=20Cross-App-SSO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kanonische String-Konstante "ev.mana.session", die jede mana-e.V.- App in ihre `AppConfig.keychainAccessGroup` füttern kann. Apps mit diesem Wert + dem entsprechenden `keychain-access-groups` Entitlement + Apple-Dev-Portal-Capability "Keychain Sharing" teilen Auth-Tokens auf demselben Device — ein Login in einer App genügt, alle anderen starten direkt im .signedIn-Status. Wert kann eigene Apps weiterhin opt-out: `keychainAccessGroup: nil` plus kein Entitlement-Eintrag → impliziter App-Default-Keychain. CHANGELOG offen — bump auf v1.7.0 sobald mindestens eine App den neuen Wert konsumiert (folgt im selben Sprint). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ManaCore/Auth/SharedKeychainGroup.swift | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Sources/ManaCore/Auth/SharedKeychainGroup.swift diff --git a/Sources/ManaCore/Auth/SharedKeychainGroup.swift b/Sources/ManaCore/Auth/SharedKeychainGroup.swift new file mode 100644 index 0000000..7bec138 --- /dev/null +++ b/Sources/ManaCore/Auth/SharedKeychainGroup.swift @@ -0,0 +1,36 @@ +import Foundation + +/// Kanonische Cross-App-Keychain-Group für alle nativen mana-e.V.-Apps. +/// +/// Apps, die diese Group im `keychain-access-groups` Entitlement haben +/// und denselben String als `ManaAppConfig.keychainAccessGroup` +/// liefern, teilen ihre Auth-Tokens auf demselben Device. Ein Login in +/// einer App bedeutet damit: alle anderen mana-Apps starten direkt im +/// `.signedIn`-Status. +/// +/// Wird der Wert geändert, müssen ALLE Apps in dieser Liste: +/// - `project.yml` `keychain-access-groups` Entitlement aktualisieren +/// - `AppConfig.keychainAccessGroup` aktualisieren +/// - **plus** Apple-Dev-Portal-Capability "Keychain Sharing" mit +/// dem neuen Group-Namen aktivieren (sonst OSStatus -34018 +/// errSecMissingEntitlement beim ersten Token-Write) +/// +/// Apps, die Cross-App-SSO **nicht** wollen (z.B. wenn der Login +/// bewusst getrennt bleiben soll), setzen `keychainAccessGroup: nil` +/// und tragen kein `keychain-access-groups` Entitlement. +public let ManaSharedKeychainGroup = "ev.mana.session" + +/// Convenience-Hilfe für SwiftUI-Apps: liefert den Wert, den +/// `ManaAppConfig.keychainAccessGroup` bekommen muss, damit Cross-App- +/// SSO greift. iOS resolved den String automatisch über die +/// Team-ID des installierten Profiles — `$(AppIdentifierPrefix)` muss +/// im Entitlement-File stehen, im Code reicht der bloße Name. +/// +/// Pendant zum entitlement-Eintrag: +/// ``` +/// keychain-access-groups: +/// - $(AppIdentifierPrefix)ev.mana.session +/// ``` +public func manaSharedKeychainAccessGroup() -> String { + ManaSharedKeychainGroup +}