Files
homeclaw/.smallclaw
kimandClaude Sonnet 5 724a04dbac fix: 밀링캠 PTZ가 만료된 세션 토큰 때문에 조용히 죽어있던 문제
옥토프린트(octoprint-mill) 웹캠 오버레이(control.jinja2, 컨테이너 안에 정적 스크립트로
박혀있음, homeclaw repo엔 없음)가 /api/nvr/ptz를 부를 때 로그인 세션 토큰을 그대로 박아
써왔다. 세션은 7일 지나면 만료되는데(SESSION_MAX_AGE_MS) 09-17에 만든 토큰이 09-24경
만료되며 PTZ 전체(상하좌우 다)가 401로 죽었다 — 오버레이 JS가 fetch 에러를 그냥 삼켜서
화면엔 아무 표시도 없었다. 사용자는 틸트만 시도해서 '틸팅이 안 된다'로 신고했지만 실은
전 방향이 죽어 있었다(2026-09-28 실측).

고친 내용:
- gateway.auth_token(vault 저장, 안 만료되는 고정 토큰)을 새로 발급하고, /api/nvr/ptz와
  /api/nvr/mjpeg-health 두 라우트가 이걸 세션 대신/추가로 받아들이게 함(nvr.ts,
  requireGatewayAuth 적용).
- 그런데 requireGatewayAuth의 Bearer/X-Gateway-Token 분기는 사실 이전부터 죽은 코드였다 —
  이보다 먼저 도는 전역 인증 미들웨어(server.ts)가 activeSessions(로그인 세션)만 알고
  gateway.auth_token 자체는 몰라서 그 앞에서 무조건 401을 내고 있었다. 전역 미들웨어에
  /api/nvr/ptz, /api/nvr/mjpeg-health 두 경로만 gateway.auth_token도 인정하는 예외를
  추가(req.user는 안 심음 — 다른 라우트의 role 체크에 영향 없게).
- auth_token은 config.json에 평문으로 안 두고 다른 시크릿처럼 vault:gateway.auth_token
  참조로 저장(resolveSecret으로 해석).

옥토프린트 컨테이너의 control.jinja2도 새 토큰으로 패치(런타임 파일이라 이 커밋엔 안
잡힘 — 백업은 옥토서버 /home/kim/octoprint-mill-overlay/). 실제 카메라(ONVIF)까지
Up/Down/Left/Right 전부 {ok:true} 확인.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 10:47:49 +09:00
..
2026-04-29 11:45:59 +09:00