소셜 로그인 인증 경로 · 세션 전이 · Apple 로그인 콜백 · 인증 테스트
This commit is contained in:
+16
-17
@@ -23,7 +23,7 @@ cd app
|
||||
flutter pub get
|
||||
flutter run # 실기기·시뮬레이터
|
||||
flutter analyze # 정적 분석
|
||||
flutter test # 스모크·회귀 테스트 9건
|
||||
flutter test # 스모크·인증 상태 전이·회귀 테스트 19건
|
||||
flutter build apk --debug # Android 디버그 APK
|
||||
```
|
||||
|
||||
@@ -141,12 +141,17 @@ bool get isMockSessionAvailable => !FirebaseBoot.isLive && !_releaseMode;
|
||||
|---|---|---|---|
|
||||
| 카카오 | 스텁 | `KeylessSocialProvider` | 앱 키(Q3) |
|
||||
| 네이버 | 스텁 | `KeylessSocialProvider` | 앱 키(Q3) |
|
||||
| Apple | 실 코드 경로 | `AppleSignInProvider` | Firebase 설정(S2) + Xcode Capability |
|
||||
| Apple | 실 코드 경로 | `AppleSignInProvider` | Firebase 설정(S2) + Xcode Capability + Android Service ID/redirect URI |
|
||||
| Google | 실 코드 경로 | `GoogleSignInProvider` | Firebase 설정(S2) |
|
||||
|
||||
설계 원칙: **「키 미투입」은 예외가 아니라 상태다.** 예외를 던지지 않고
|
||||
`AuthNotConfigured(provider, missing)` 를 반환해 "무엇이 없어서 못 쓰는지"를 화면에 그대로 보여 준다.
|
||||
|
||||
Apple은 로그인 시도마다 암호학적 nonce를 만들고 SHA-256 해시를 Apple에, 원문 nonce를
|
||||
Firebase에 전달한다. Android에서는 Service ID와 redirect URI가 없으면 SDK를 호출하지 않는다.
|
||||
Firebase가 live가 되면 보존된 `currentUser`를 앱 시작 시 복원하고 `authStateChanges`를 계속 들어
|
||||
만료·원격 로그아웃도 라우터에 반영한다. 이 내부 계약은 fake 세션·provider로 자동 검증한다.
|
||||
|
||||
**이메일 가입은 구현하지 않았다.** CD-18 미확정(Q2)이라 `SocialAuthProvider` 인터페이스에
|
||||
구현체 하나가 더 붙을 자리만 비워 뒀다. **기능 플래그 상수는 두지 않았다** — 읽는 분기가 없는
|
||||
플래그는 "false 라서 닫혀 있다" 는 착각만 만들고, 누가 true 로 바꿔도 아무 일이 일어나지 않는다
|
||||
@@ -188,7 +193,8 @@ app/
|
||||
├── analysis_options.yaml flutter_lints + strict-casts/raw-types/inference
|
||||
├── tool/gen_tokens.py design-tokens.md → tokens.dart 생성기
|
||||
├── firebase/ T1(Firestore 설계) 영역 — 규칙·인덱스
|
||||
├── test/app_smoke_test.dart 스모크 3종
|
||||
├── test/app_smoke_test.dart 앱 기동·5탭·목 세션 회귀 10건
|
||||
├── test/auth_repository_test.dart provider 결과·세션 복원·로그아웃 9건
|
||||
└── lib/
|
||||
├── main.dart FirebaseBoot.init() → runApp
|
||||
├── app.dart MaterialApp.router + 테마 주입
|
||||
@@ -214,21 +220,14 @@ Analyzing app...
|
||||
No issues found! (ran in 3.2s)
|
||||
|
||||
$ flutter test
|
||||
00:00 +0: loading /Users/Kinos/Projects/p-fancake/app/test/app_smoke_test.dart
|
||||
00:00 +0: 1. 앱이 예외 없이 뜨고 로그인 화면이 나온다
|
||||
00:00 +1: 2. 하단 탭 5개가 계약 표기·순서 그대로 렌더된다
|
||||
00:00 +2: 릴리스 빌드에서는 목 우회 입구가 열리지 않는다 목 모드 + 릴리스면 isMockSessionAvailable 이 false 다
|
||||
00:00 +3: 릴리스 빌드에서는 목 우회 입구가 열리지 않는다 릴리스에서 signInWithMockSession 을 불러도 로그인되지 않는다
|
||||
00:00 +4: 릴리스 빌드에서는 목 우회 입구가 열리지 않는다 릴리스 빌드 로그인 화면에 목 세션 버튼이 없다
|
||||
00:00 +5: 릴리스 빌드에서는 목 우회 입구가 열리지 않는다 디버그 빌드에서는 목 세션 버튼이 있다 (가드가 과하게 잠그지 않았는지)
|
||||
00:00 +6: 제공자 4종의 미투입 안내에 내부 파일 경로가 들어가지 않는다
|
||||
00:00 +7: 화면에 띄우는 사유에 내부 파일 경로가 들어가지 않는다
|
||||
00:00 +8: 3. 탭을 전환하면 각 탭 루트 화면이 바뀐다
|
||||
00:00 +9: All tests passed!
|
||||
app_smoke_test.dart: 앱 기동·세션 복원·5탭·릴리스 목 우회 차단 10건 통과
|
||||
auth_repository_test.dart: 제공자 4종 성공/취소/실패/미설정·예외 안전성·
|
||||
Android Apple 설정 게이트·세션 복원/만료·로그아웃/재로그인 9건 통과
|
||||
00:01 +19: All tests passed!
|
||||
|
||||
$ flutter build apk --debug
|
||||
Running Gradle task 'assembleDebug'... 219.5s (첫 빌드 — NDK 28.2 자동 설치 포함)
|
||||
✓ Built build/app/outputs/flutter-apk/app-debug.apk (164,432,730 bytes · 약 156.8 MiB · debug)
|
||||
✓ Built build/app/outputs/flutter-apk/app-debug.apk (164,473,984 bytes · 약 156.9 MiB · debug)
|
||||
10.6s (증분 재빌드)
|
||||
|
||||
$ flutter build ios --debug --no-codesign
|
||||
@@ -242,7 +241,7 @@ $ python3 tool/gen_tokens.py
|
||||
전 쌍 AA 통과. (최저 color-on-neon-violet / color-neon-violet = 5.09:1)
|
||||
```
|
||||
|
||||
**테스트 9종은 Firebase 설정 파일이 없는 상태(목 모드)에서 통과한 결과다.**
|
||||
**테스트 19종은 Firebase 설정 파일이 없는 상태(목 모드)에서 통과한 결과다.**
|
||||
|
||||
음성 검증 2회 — 테스트가 실제로 게이트 역할을 하는지 직접 깨뜨려 확인했다.
|
||||
|
||||
@@ -296,7 +295,7 @@ I flutter : [FirebaseBoot] detail :: PlatformException(java.lang.Exception: Fail
|
||||
| L6 | 탭 아이콘이 Material 기본(Q15) | 시안 탭바에는 아이콘이 없어 대조 대상이 없다 | 3주차 |
|
||||
| L7 | **iOS 최소 지원 버전을 13.0 → 15.0 으로 올렸다** | `firebase_auth` 6.x 가 15.0 이상을 요구해 13.0 으로는 `pod install` 이 실패했다. 기준 단말 iPhone 11(S4)은 iOS 18까지 지원하므로 범위 영향 없음. `ios/Podfile` · `Runner.xcodeproj` 3곳 수정 | 반영 완료 |
|
||||
| L8 | **릴리스 서명 키 없음 → `flutter build apk --release` 는 의도적으로 실패한다** | 서명 키는 스토어 등록 명의(Q5·S3)가 정해져야 만들 수 있다. Flutter 기본 템플릿은 이 상태에서 **debug 키로 조용히 서명**해 Play 가 거부하는 산출물을 "성공"으로 내놓는다 — 그 경로를 막고 사유를 띄우도록 `android/app/build.gradle.kts` 를 고쳤다. 키가 생기면 `android/key.properties`(storeFile·storePassword·keyAlias·keyPassword)만 놓으면 된다. 해당 파일과 `*.jks`/`*.keystore` 는 `app/android/.gitignore` 가 이미 막고 있다(확인함) | Q5·S3 |
|
||||
| L8-1 | debug APK 164,432,730 bytes(약 156.8 MiB) | debug 빌드 특성(미난독화·전 ABI 포함). release + `--split-per-abi` 로 크게 줄어들지만 **L8 때문에 아직 실측하지 못했다** | Q5·S3 |
|
||||
| L8-1 | debug APK 164,473,984 bytes(약 156.9 MiB) | debug 빌드 특성(미난독화·전 ABI 포함). release + `--split-per-abi` 로 크게 줄어들지만 **L8 때문에 아직 실측하지 못했다** | Q5·S3 |
|
||||
| L9 | 첫 Gradle 빌드에서 Kotlin 데몬 경고 1회 | `e: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0` — 자동 재시도로 성공했고 산출물에 영향 없음. 증분 빌드에서는 재현되지 않음 | — |
|
||||
| L9-1 | iOS 런치 화면 색 변경은 **컴파일 검증만** 했다 | `LaunchScreen.storyboard` 배경을 흰색 → `color-cosmic-void`(#000)로 바꿨다. Android 는 에뮬레이터에서 눈으로 확인했지만 iOS 는 시뮬레이터 실행을 하지 않아 빌드 성공까지만 확인했다 | 3주차 실기기 빌드 |
|
||||
| L10 | 온보딩 6화면 라우트 없음 | S-A-INTRO · S-A-TERMS · S-A-PROFILE · S-A-ARTIST · S-A-PLANET-NEW · S-A-PERMS | 3주차 |
|
||||
|
||||
Reference in New Issue
Block a user