feat(auth): verify OIDC with test IdP - #178
Conversation
hojinzs
left a comment
There was a problem hiding this comment.
Project #14 watchdog review — approve
Reviewed PR #178 at head 0c837d9cfc7e11743629a808bd060f641bf492d6 against main.
No concrete blocking OIDC/auth, security, correctness, or regression finding was identified. The PR adds the Dex authorization-code flow, user reuse/admin-group regression coverage, and loopback-only local test support without exposing production credentials.
Verification performed:
npm run lint— passednpm test— shared 53, API 204, web 29, CLI 51 passednpm run build— passed- Playwright test discovery — 2 OIDC tests discovered
- Preview root — HTTP 200
- Preview
/api/health— HTTP 200, status ok - GitHub CI checks including
e2e— successful on this head
The local OIDC E2E could not start because the Docker daemon was unavailable; this is recorded as environmental/inconclusive in the evidence bundle, while the corresponding GitHub e2e check is green.
Evidence Browser bundle: https://evidence-browser.dev0.daniworks.kr/w/evidence-browser/b/project14-pr-178-20260821-023840z
The PR is not low-risk for automatic Land because it changes authentication/API/test infrastructure. I am approving it but leaving Project status in In review for Steve's Land decision.
hojinzs
left a comment
There was a problem hiding this comment.
요구사항 검증 (Issue #168)
이슈 스코프 4개 항목 모두 충족을 확인했습니다.
- 테스트 스택 IdP:
docker-compose.test.yml에dexidp/dex:v2.44.0서비스 추가,tests/oidc/dex-config.yaml에 static client/password/mock group connector 구성 — 완료. - Authentik sign-off 문서: README에 Authentik
2026.8.0기준 provider/application 생성, redirect URI, group claim mapping 절차 기록 — 완료. - AC-04 검증:
docs/ACCEPTANCE_CRITERIA.md:309가 evidence 번들 링크(/w/default/b/20260821-0216-...)와 함께 Verified로 갱신됨. 매트릭스(구 787라인 부근) Auth OIDC 컬럼은 기존에 이미 정확히 표기되어 있어 추가 수정 불필요 — 완료. - Happy-path 이외 QA 케이스: 첫 로그인 자동 프로비저닝, 두 번째 로그인 동일 row 재사용(신규 unit test), admin group→role 매핑(신규 unit test + e2e), allowlist 밖 그룹 거부(기존 unit test
rejects users outside configured allowed groups),AUTH_LOCAL_ENABLED=false시 password 로그인 차단이면서 SSO는 동작(e2e), API-key bundle upload 비회귀(e2e) — 모두 커버됨.
이슈 요구사항을 벗어난 임의의 오버엔지니어링은 발견되지 않았습니다. oidc.ts의 isLoopbackIssuer/allowInsecureRequests 추가는 명시적 요구사항은 아니지만 Dex가 plain HTTP인 loopback 환경에서 CI e2e가 동작하도록 하는 데 필요한 최소한의 기술적 인에이블러이고, 프로덕션 이슈어(HTTPS)에는 영향이 없도록 hostname으로 엄격히 스코프되어 있어 문제 없다고 판단했습니다.
Smoke Test
- Preview 환경: PR 코멘트의 preview URL(
evidence-browser-pr-178.dev0.daniworks.kr)에 접근을 시도했으나 이 리뷰 세션의 네트워크 정책상 아웃바운드 연결이 차단(403)되고 별도 계정 정보도 제공되지 않아 접근 불가했습니다. - 대체 검증: 로컬에서
npm -w @evidence-browser/api run test로oidc.test.ts,llm-text.test.ts포함 204개 테스트 전체 통과 확인. 이 샌드박스에는 Docker 데몬이 없어e2e:oidc(Dex 컨테이너 기반) 자체는 로컬 재현이 불가능했으나, 해당 워크플로가 이미 GitHub Actionse2ejob에서 green으로 통과했고(docker compose -f docker-compose.test.yml up oidc를 포함한npm run e2e체인), lint/build/typecheck/coverage/changeset job 모두 green임을 확인했습니다.
코드 품질 리뷰
P1/P2/P3 이슈는 발견되지 않았습니다. packages/api/src/lib/auth/oidc.ts의 isLoopbackIssuer에 nit 하나만 인라인 코멘트로 남겼습니다 (죽은 분기, 기능 영향 없음).
결론
Approve합니다. 요구사항 반영이 충실하고, 회귀 없이 CI가 green이며, 발견된 이슈는 머지를 막을 수준이 아닌 nit 1건뿐입니다.
Generated by Claude Code
| return ( | ||
| hostname === "localhost" || | ||
| hostname === "127.0.0.1" || | ||
| hostname === "::1" || |
There was a problem hiding this comment.
nit: In Node, new URL(...).hostname for an IPv6 literal always includes the brackets (new URL('http://[::1]:5556').hostname === '[::1]'), so this hostname === "::1" branch never actually matches — the bracketed check right below already covers the real case. Harmless dead branch, not a functional bug; could drop this line for clarity.
Generated by Claude Code
TL;DR
docker-compose.test.yml에 추가하고,npm run e2e가 authorization-code 로그인 플로우를 cold stack에서 검증하도록 연결했습니다.usersrow 재사용, Dex group claim 기반 admin 매핑, allowlist 거부,AUTH_LOCAL_ENABLED=falsepassword 차단, API-key bundle upload 비회귀까지 포함합니다..evidence/20260821-0216-feat-168-oidc-idp-stack-attempt1/증거 번들로 Verified 처리했고, Authentik2026.8.0기준 수동 sign-off 절차를 README에 문서화했습니다.변경 지점 다이어그램
여기부터 보세요
docker-compose.test.yml,tests/oidc/dex-config.yaml— CI용 Dex IdP와 static client/password/mock group connector 설정packages/web/playwright.oidc.config.ts,packages/web/e2e-oidc/oidc-flow.spec.ts— 실제 OIDC authorization-code e2e 및 정책/비회귀 케이스packages/api/src/lib/auth/oidc.ts,packages/api/src/lib/auth/oidc.test.ts— loopback issuer 처리와 OIDC user 재사용/admin group 테스트README.md,docs/ACCEPTANCE_CRITERIA.md,docs/ARCHITECTURE.md,docs/PRD.md— Authentik sign-off, AC-04 Verified, stale “not OIDC” 문구 정정위험 & 롤백
userstable rebuild를 수행하므로 업그레이드 전에evidence.db백업이 필요합니다.변경 파일
.changeset/curly-oidc-browsers.md.env.exampleREADME.mddocker-compose.test.ymldocs/ACCEPTANCE_CRITERIA.mddocs/ARCHITECTURE.mddocs/PRD.mdpackage.jsonpackages/api/src/lib/auth/oidc.test.tspackages/api/src/lib/auth/oidc.tspackages/api/src/lib/mcp/llm-text.test.tspackages/api/src/lib/mcp/llm-text.tspackages/web/e2e-oidc/oidc-flow.spec.tspackages/web/package.jsonpackages/web/playwright.oidc.config.tstests/oidc/dex-config.yamlEvidence
npm run lint— passnpm test— passnpm run build— passnpm run e2e— pass (기존 Playwright 12건 + Dex OIDC 2건)/w/default/b/20260821-0216-feat-168-oidc-idp-stack-attempt1로컬 업로드/metadata 200).changeset/curly-oidc-browsers.md— bumppatch(inferred: test-stack/docs verification plus MCP auth guidance update)Issues
머지 후/사람 확인
2026.8.0절차로 수동 재검증하세요. 자동 CI는 issue 요구대로 경량 Dex IdP를 사용합니다.