feat(auth): ManaSharedKeychainGroup für Cross-App-SSO
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) <noreply@anthropic.com>
This commit is contained in:
parent
4ce22ac74e
commit
d4cff490c4
1 changed files with 36 additions and 0 deletions
36
Sources/ManaCore/Auth/SharedKeychainGroup.swift
Normal file
36
Sources/ManaCore/Auth/SharedKeychainGroup.swift
Normal file
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue