概要
Apple Sign In を唯一の認証手段とし、Supabase Auth と連携してセッション管理を行う。
キーチェーン経由でセッション永続化、起動時に自動でセッション復元。
関連画面
処理フロー
sequenceDiagram
participant U as User
participant V as LoginView
participant ASS as AppleSignInService
participant SP as Supabase Auth
participant AVM as AuthViewModel
participant DB as Supabase users表
U->>V: Apple Sign Inタップ
V->>ASS: signInRequested()
ASS->>ASS: nonce生成 + SHA256ハッシュ
ASS->>U: Apple ID認証ダイアログ
U-->>ASS: 認証承認 + idToken
ASS->>SP: signInWithIdToken(idToken, nonce)
SP-->>ASS: セッション
ASS-->>AVM: 完了通知
AVM->>DB: fetchOrCreateUser(authId)
DB-->>AVM: AppUser
alt 新規ユーザー
AVM->>V: authState=.needsSetup
V->>U: SetupProfileView表示
else 既存ユーザー
AVM->>V: authState=.authenticated
V->>U: MainTabView表示
end
セッション管理
- Supabase Auth: キーチェーン経由でトークン永続化
- 自動トークンリフレッシュ: SupabaseService 初期化時に有効化
- 起動時の動作:
AuthViewModel.checkSession() でセッション復元
- ログアウト: SettingsView から Supabase signOut + キーチェーンクリア
ビジネスルール
- 認証手段は Apple Sign In のみ(メール・SMS・Googleは未対応)
- nonce は SecRandomCopyBytes でランダム生成、SHA256 でハッシュ化してリクエスト
- 新規ユーザーの初期 displayName は「名無し」
- SetupProfileView 完了まで authState は .needsSetup(MainTabView へ遷移しない)
外部連携
| 連携先 | 用途 | 備考 |
| Apple Sign In | idToken の発行 | AuthenticationServices フレームワーク |
| Supabase Auth | signInWithIdToken / セッション管理 | RLS の前提 |
| Keychain | セッショントークン永続化 | Supabaseクライアントが自動処理 |
エラー処理
| 発生条件 | 対応 |
| Apple Sign Inキャンセル | サイレント、再試行を促す |
| nonce検証失敗 | 「サインインに失敗しました」 |
| Supabase通信失敗 | RetryHelperで再試行 |
| セッション期限切れ | LoginView へ自動遷移 |
実装メモ
- CheckedContinuation で非同期コールバックを await でキャッチ
- @Observable @MainActor の AuthViewModel で状態管理
- Logger.Auth / Logger.AppleSignIn カテゴリ
- Sign in with Apple JS(Web版)対応は v1.x 検討
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |