Actions
이슈 #436
진행중
JL
HP
[Go backport] Admin Dev Console GoTrue UI — Phase 3
이슈 #436:
[Go backport] Admin Dev Console GoTrue UI — Phase 3
시작일:
2026/05/13
완료일:
2026/05/13 (약 6달 지연)
진척도:
0%
추정시간:
설명
배경¶
GoTrue 인증 전환 후속 작업. 현재 Admin Dev Console (:9090) 은 SAML/Basic Auth 로만 접근 가능하고, GoTrue 사용자 토큰을 테스트하려면 외부에서 curl/Postman 으로 /signup / /token?grant_type=password 을 직접 호출해 access_token 을 얻어 paste 해야 한다. 매번 번거로움.
Rust 측 #424 를 Go 원본으로 백포트해 Admin 화면에서 직접 GoTrue 사용자를 생성/로그인하고 JWT 를 자동 저장한다.
작업 범위¶
Admin server¶
-
internal/admin/server.go에 GoTrue proxy 엔드포인트 추가:-
POST /api/auth/gotrue/signup→ GoTrue/signup에 그대로 forward -
POST /api/auth/gotrue/login→ GoTrue/token?grant_type=password에 forward
-
- Audit 로그 (
access_logssource="admin"):- signup / login 의 성공·실패 모두 기록
- Fields: email, ip, user_id(성공 시), error message(실패 시)
- Client IP 우선순위:
CF-Connecting-IP>X-Real-IP>X-Forwarded-For첫 항목 >r.RemoteAddr
Admin UI (internal/admin/pages.go)¶
- Auth 섹션 에 카드 2개 추가:
- Sign Up (email/password input + Sign Up 버튼). autoconfirm=true 일 때 즉시 세션 반환 → access_token 자동 저장
- Log In (email/password input + Log In 버튼). 응답의 access_token 자동 저장
- 기존 "Paste JWT (manual)" 카드 동일하게 유지
Config¶
-
cfg.GoTrueURL(envGOTRUE_URL/GOTRUE_INTERNAL_URL, 기본http://localhost:9011) - Admin HTTP 클라이언트 (
net/http) 공유 instance
제외 (Phase 4+ 이슈 예정)¶
- FriendsService 테이블 user_id 전환
-
nodes.owner_wallet_address제거 -
virtual_node_*스키마 user_id 직접 전환
DoD¶
-
make build,make test통과 - Admin UI Auth 탭에서 Sign Up 클릭 시 즉시 JWT 자동 저장이 일어나도록 구현(autoconfirm=true 기준)
- Log In 클릭 시 JWT 자동 저장
-
signup/login 성공·실패 모두 audit 로그에 기록 (
access_logssource="admin", path="/api/auth/gotrue/{signup,login}") - Client IP 정확 주소로 기록 (CF/X-Real-IP/X-Forwarded-For 우선순위)
관련 이슈¶
JL James Lee이(가) 6달 전에 변경
- 상태을(를) 신규에서 해결(으)로 변경되었습니다.
Phase 3 구현 완료¶
commit:server|cf27194
적용된 변경¶
Config
-
Config.GoTrueURL string필드 추가. env 우선순위:GOTRUE_INTERNAL_URL>GOTRUE_URL> 기본http://localhost:9011.settings.json영속화 경로도 표기 (gotrueUrl)
Admin server
-
internal/admin/server.go:-
Server구조체에goTrueURL string+httpClient *http.Client (10s timeout)추가 - 라우트 등록 (모두
requireAuth하위):-
POST /admin/api/auth/gotrue/signup→ GoTrue/signup -
POST /admin/api/auth/gotrue/login→ GoTrue/token?grant_type=password
-
-
GET /admin/auth페이지 라우팅 -
clientIP우선순위 개선:CF-Connecting-IP>X-Real-IP>X-Forwarded-For첫 항목 >r.RemoteAddr. Cloudflare 프론트 환경에서 감상되지 않은 원출 IP 확보.
-
Admin gotrue.go (신규)
-
proxyGoTrue(action, targetPath)공통 포워딩기: 64KB 제한 그대로 JSON forward, GoTrue 응답을 status + Content-Type 유지 그대로 패스스루 -
markAdminAction("gotrue.signup" / "gotrue.login")로 기존 admin audit log 경로에 명시적 action 채움: 성공 시user_id, 실패 시 시원스트림 에러 메시지(error_description/msg/message/error순서로 추출). email + IP 동반 -
extractGoTrueUserID,summariseGoTrueError헬퍼
Admin UI (pages.go)
- 네비게이션에
Auth탭 추가 -
tmplAuth페이지: 3개 카드(Sign Up / Log In / Paste JWT manual) + 공용 JWT bar(상단 고정, copy/clear 버튼, user_id 표시) -
localStorage('alphea.adminJwt' & 'alphea.adminUserId')로 세션 내 JWT 자동 복구 - JavaScript 헬퍼
-
gtPickToken가payload.access_token(login) 또는payload.session.access_token(signup) 둘 다 처리 -
gtPickUserID으로 GoTrue user id 추출 - 성공/실패 UX 메시지 색상 구분(error_description / msg / error 순서로 점진적 텍스트)
-
테스트 (gotrue_test.go 신규)
-
TestProxyGoTrueForwardsSignup: body 그대로 forward + 해결된 user_id 가 admin action log 에 기록되는지 검증 -
TestProxyGoTrueLoginPassesGrantType: login 경로가 GoTrue/token?grant_type=password로 라우팅되는지 검증 -
TestProxyGoTrueRejectsBlankCredentials: 빈 자격 증명 시 upstream 호출 없이 400 반환 -
TestClientIPPrefersCloudflareHeader: 새 IP 우선순위 검증
문서
-
CLAUDE.mdAPI Endpoints 표에/admin/auth및/admin/api/auth/gotrue/{signup,login}추가
검증¶
-
go build ./...PASS -
go vet ./...PASS -
go test ./...PASS (admin 새 테스트 4개 포함 전체 통과)
DoD 체크¶
-
make build,make test통과 - Admin UI Auth 탭에서 Sign Up 클릭 시 즉시 JWT 자동 저장(autoconfirm=true 기준)
- Log In 클릭 시 JWT 자동 저장
-
signup/login 성공·실패 모두
access_logs에 source="admin", 경로="/admin/api/auth/gotrue/{signup,login}", 세부(action / email / ip / status / user_id|error)가 기록 (기존 admin audit log 경로 재사용) - CF-Connecting-IP 우선순위로 IP 기록
운영 적용¶
git pull
docker compose -f alphea-rpc/docker-compose.yml up -d --build
Auth 탭 접속 → Sign Up 수행 → JWT bar가 표시됨. 다른 탭의 RPC 테스트 도구는 localStorage.alphea.adminJwt 를 가져다 Authorization: Bearer ... 헤더로 쓰면 됨.
후속 (별도 이슈)¶
- FriendsService 테이블 user_id 전환 (friends/referral_claims/rewards_log)
-
nodes.owner_wallet_address제거 -
virtual_node_*user_id 직접 키 전환
CP Chris Park이(가) 6달 전에 변경
- 담당자을(를) James Lee에서 Henry Park(으)로 변경되었습니다.
Actions