CrownyAI 네이티브 로그인 창 + 계정 상태
개요
CrownyAI.app(네이티브 크라우니브라우저/오피스)이 crowny-ai 서버(ai.crowny.org)의
통합ID로 로그인하고, ownerToken을 macOS Keychain에 보관·복원·표시·폐기한다.
무로그인 로컬 편집은 그대로 허용(로그인=클라우드 동기 전용).
핵심 사실 (재확인)
- auth 서버 실주소 = :9852 (레지스트리·health·/api/auth/login 실재).
작업지시의
:9613은 nginx 정적 스텁("crowny server", 14B)일 뿐 auth 없음.
→ CAAuthBaseURL() 기본
http://127.0.0.1:9852, 환경변수
CROWNY_AI_URL로 오버라이드.
- 토큰 모델 = 지속형 ownerToken(u_...) 1개. access/refresh JWT 아님, 서버측 만료 없음,
/api/auth/verify·
/api/auth/refresh 엔드포인트 없음. 로그인 응답
{ok,username,ownerToken}.
- 같은 날 병렬 세션이 추가한
/api/office/save|list|get|delete가 바로 이 ownerToken을
게이트(Authorization: Bearer / X-Crowny-Owner)로 소비 → 다음 조각(파일 저장/동기)과 정합.
실측: 저장 토큰으로 office/list 200 {ok,docs:[]}, 무토큰 401.
무엇을 했는지
native/crowny-ai-main.m (네이티브 IO만 수정)
- CAAccount 싱글턴: loginWithUsername:password:completion:(NSURLSession POST /api/auth/login),
Keychain(kSecClassGenericPassword, service=org.crowny.ai.account) store/load/delete,
restoreFromKeychain(앱 재시작 자동 로그인), logout(토큰 폐기). loggedIn/username/ownerToken 전역 접근.
- CALoginWindowController: 로그인 시트/창(아이디·비밀번호·상태라벨·로그인/취소, Enter=로그인).
성공→창 닫힘, 실패→에러 표시, 로그인 중→버튼 비활성. 오프라인=우아한 "연결 실패" 메시지.
- 계정 메뉴: 메뉴바 "계정" 동적 재구성(rebuildAccountMenu) — 로그아웃 시 "로그인…",
로그인 시 "<user>(로그인됨)" + "로그아웃"(CADialog 확인). CAAccountChangedNotification 관측.
- didFinishLaunching에서 restoreFromKeychain 호출 → 저장 토큰 복원 + 메뉴 갱신.
native/계정상태.한선 (한선씨 동반)
토큰 상태기계(로그인전이·토큰유효·갱신필요·만료갱신·로그아웃·무로그인 로컬편집허용) +
4상 토큰판정(티 유효/옴 만료갱신/타 거부/음 무로그인). hanseonc_high 컴파일 + crownyc run
자가검증 13/13 PASS. 지속형(만료==0 무기한)과 JWT(만료>0 시각비교) 양쪽 커버.
게이트 결과
- 계정상태.한선 13/13 · make ai 빌드 성공(경고1=기존 무관) · CrownyAI 3초 생존 ALIVE
- 로그인 왕복(하네스 acct_test.m, 실계정 crownyai_qa, 라이브 :9852):
[1] 로그인 OK 토큰획득 · [2] 재시작 Keychain 복원 OK 토큰일치 · [3] 로그아웃 토큰폐기 OK → PASS
- 오프라인(죽은 포트): "연결 실패…" 우아한 실패, 크래시 없음
- 계정명 표시 + 로그인 창 렌더 스크린샷 확인(메뉴바 계정 + 로그인 시트)
- 무로그인 로컬편집 허용(로그인 미호출로도 앱 정상, AI홈/런처 정상)
- 문서 회귀 27/27 PASS(오피스 브릿지 무수정) · 기존 저장/열기/내보내기 메뉴 무회귀(컴파일 정합)
관련 파일
- /Users/ef/crownybrowser/native/crowny-ai-main.m (CAAccount·CALoginWindowController·계정 메뉴)
- /Users/ef/crownybrowser/native/계정상태.한선 (상태기계 정본, 13/13)
- /Users/ef/crowny-ai/engine/auth.js (참고: login→{ok,username,ownerToken})
무수정 확인
crownyBridge.js·앱 번들(bundle/office/app)·crowny-shell.m·Makefile 기존타깃 무수정.
Security.framework는 ai LDFLAGS에 기존부터 링크되어 있어 Makefile 변경 불요.
잔여 이슈
- 실계정 시연용 crownyai_qa 계정이 users.json에 남음(무해, 필요시 제거).
- refresh는 서버에 엔드포인트 없어 미배선(지속형 토큰이라 불필요) — 한선씨는 일반 케이스 커버.
- 다음 조각: CAAccount.ownerToken을 오피스 cdf 클라우드 저장/동기(/api/office/save)에 사용.