OpenApps 프론트엔드
OpenApps 앱의 클라이언트 측: 웹 또는 모바일 앱이 호출하는 SDK, 최종 사용자 인증 방식, 호스팅된 프론트엔드 제공 방식입니다. 정책은 모든 클라이언트 쓰기 작업을 제어하므로, 클라이언트 작업에 규칙이나 불변 조건이 필요할 때는 openapps-backend 스킬과 함께 사용하고, 호스팅 및 도메인 관리는 openapps-deploy 스킬을 사용하세요. 전체 스킬군에 걸친 라우팅은 루트 openapps 스킬을 참조하세요.
참조 라우터
현재 작업이나 용어와 일치하는 행만 읽으세요.
| 작업 또는 용어 | 읽기 |
|---|---|
SDK 읽기, 쓰기, 구독, 페이지네이션, queryAggregate, count, 필터, 정렬, 커서, setMany, set(path, null) | SDK 참조 |
| 웹 프론트엔드 구축 | 웹 앱 가이드 |
로컬 개발 서버 (npm run dev, Vite, localhost), 로그인 팝업 실패, redirect_uri origin is not a registered origin, 로컬 개발 중 CORS | localhost에서 개발 |
새로고침 타이머, setInterval, 폴링, "상태 유지", 카운트다운, 오래된 UI | SDK 참조 |
| React Native / 모바일용 구축 | React Native 가이드 |
앱 사용자 이메일 OTP, OAuth, openBoundedWidget, 통합 로그인 위젯, 기본 Turnkey 인증 | 앱 인증 |
자체 지갑 로그인; walletLogin, authMethod:'phantom', supportsWalletSignIn, 지원되지 않는 지갑 / Wallet Standard | 지갑 로그인 |
새로고침 시 지갑 로그인 손실, getCurrentUser() null 반환, bounded_last_auth_method, 세션 복원 방법 | 지갑 로그인 - "지갑 세션은 새로고침에도 유지됩니다" |
| 게스트, 익명 사용자, 초대 링크, 계정 업그레이드 | 익명 계정 |
사용자의 X 계정 연결, connect('x'), completeConnection, getConnections, 인증된 X 핸들, __connections__ | 연결된 계정 |
| 호스팅된 프론트엔드 및 앱 URL | 프론트엔드 호스팅 |
CLI 개발자 로그인 또는 openapps login | 개발자 계정 |
임베디드 지갑, auth.wallets, @user.address (이메일/소셜 로그인 후) | 임베디드 지갑 |
onramp(), 카드로 SOL/USDC 구매, Coinbase Onramp, 지갑 충전 | onramp |
핵심 원칙
- 모든 클라이언트 쓰기는 정책에 의해 제어됩니다. 쓰기 시
403응답은 클라이언트 버그가 아닌 규칙 거부입니다. 해당 규칙에 대해서는 openapps-backend 스킬을 참조하세요. - 거부된 읽기는 절대
403이 아닌 빈200응답을 반환합니다. - 기본적으로 실시간; 절대 폴링하지 마세요. 모든 컬렉션은 푸시 기반이므로, 경로를 다시 읽는
setInterval은 튜닝 선택이 아닌 버그입니다.useQuery(React) 또는subscribe를 사용하세요. 카운트다운은 로컬 클록 상태에서 작동하며, 다시 읽지 않습니다. 실시간이 아닌 몇몇 표면(runQuery,functions.invoke, 서드파티)에서는 의도적으로 폴링하되, 숨겨진 탭에서는 일시 중지하고, 타이머를 필요한 상태로만 제한하며, 백오프하고, 바운드를 설정하세요. sdk-reference.md 참조. - 계산된 값 목록은
runQueryMany로 배치 읽기하세요. 리스트에runQuery를 매핑하지 마세요. sdk-reference.md 참조. - 제공업체 API 키는 OpenApps 시크릿(백엔드)에 넣고, 프론트엔드 코드에는 절대 넣지 마세요.
npm audit이@solana/web3.js -> jayson을 통한uuid권고 GHSA-w5hq-g745-h8pq를 보고하면, 범위가 지정된 오버라이드 레시피를 사용하세요. 해당 권고를 해결하며, 설치된 lockfile에npm audit --omit=dev를 실행하고 나머지 발견 사항은 별도로 조사하세요.- 대부분의 앱에서는 인증 기본값을 유지하세요. 지갑을 "활성화"하기 위해
authMode나auth.wallets를 추가하지 마세요. 기본 Turnkey 이메일/소셜 로그인은 이미@user.address를 제공합니다. 외부 키페어 세션(자체 지갑 로그인, 서버 SDK 키페어 클라이언트, CLI 키페어 데이터 레인)에만"auth": { "wallets": true }를 배포하세요. 전체 규칙 및 옵트아웃: embedded-wallets.md. @user.id(계정 ID)는 식별/소유권이고,@user.address는 지갑입니다. 키 소유권, 멤버십, 인증 가드는 항상 존재하는@user.id에 대해 설정하세요.@user.address는 지갑/온체인 의미에만 사용하고, 절대 식별 키로 사용하지 마세요.- 휴대폰에서의 지갑 로그인은 Solana Mobile 어댑터가 필요합니다. 휴대폰 브라우저는 지갑 앱을 주입하지 않습니다.
@solana-mobile/wallet-standard-mobile을 설치하고 (.npmrc에legacy-peer-deps=true), 위젯을 열기 전에window.solana를 미리 확인하지 마세요. Solana Mobile 참조.