From ae34a6a8aa50a636c1c1ec7a24b142b330baccdc Mon Sep 17 00:00:00 2001 From: happybell80 Date: Sat, 13 Sep 2025 12:09:18 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Email=20=EC=9D=B8=EC=A6=9D=20=EC=8B=A4?= =?UTF-8?q?=EC=A0=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - happybell80/김종태: 유일하게 성공 (HTTP 200) - 0914eagle/전희재: refresh_token revoked (재인증 필요) - cdctfm/HanYong: token 없음 (신규 인증 필요) - 슬랙 메시지 모순: 실패했는데 이메일 표시는 캐시/더미 데이터 - is_equipped=true이지만 실제 토큰 상태와 불일치 🤖 Generated with Claude Code Co-Authored-By: Claude --- ...appybell80_email_skill_auth_cron_errors.md | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md b/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md index 4117041..31274a0 100644 --- a/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md +++ b/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md @@ -10,10 +10,10 @@ ### Email Skill HTTP 500 오류 - **증상**: skill_email 서비스가 HTTP 500 반환 - **에러**: `No credentials found for user: 0914eagle@gmail.com` -- **영향**: 3명 사용자 이메일 동기화 실패 - - 0914eagle (0914eagle@gmail.com) - 토큰 있음, 만료 - - happybell80 (goeun2dc@gmail.com) - 토큰 있음, 만료 - - cdctfm (cdctfm@gmail.com) - 토큰 없음 +- **실제 결과**: + - happybell80/김종태 (goeun2dc@gmail.com) - ✅ 성공 (HTTP 200) + - 0914eagle/전희재 (0914eagle@gmail.com) - ❌ 실패 "Refresh token revoked" + - cdctfm/HanYong (cdctfm@gmail.com) - ❌ 실패 "No access token found" ### Cron 트리거 권한 오류 - **증상**: `Unauthorized cron trigger attempt` 경고 발생 @@ -35,8 +35,11 @@ WHERE slack_user_id = %s AND is_equipped = true ``` 1. **테이블명 일치**: 코드와 DB 모두 `gmail_token` 단수형 -2. **토큰 현황**: 2명 refresh_token 보유 (0914eagle, happybell80), 1명 없음 (cdctfm) -3. **만료 상태**: 3명 전원 access_token 만료 (08-18~08-23 생성) +2. **is_equipped 현황**: 3명 전원 true (happybell80, 0914eagle, cdctfm) +3. **실제 원인**: + - happybell80: 토큰 유효 → 성공 + - 0914eagle: refresh_token 취소됨 → 재인증 필요 + - cdctfm: token_data=NULL → 신규 인증 필요 ### Cron 인증 취약점 ```python @@ -61,30 +64,32 @@ if auth_header != f"Bearer {expected_token}": ### 즉시 조치 (로컬 개발자) ```python -# 1. refresh_token으로 access_token 자동 갱신 구현 필요 -# skill-email/services/gmail_service.py:62-66 -if creds and creds.expired and creds.refresh_token: - creds.refresh(Request()) # 이미 구현되어 있음 +# 1. 실제 상태 확인됨: +# - happybell80: ✅ 토큰 유효, 정상 동작 +# - 0914eagle: ❌ "Refresh token revoked" → 재인증 필요 +# - cdctfm: ❌ "No access token found" → 신규 인증 필요 -# 2. Cron 문제는 해결됨 (엔드포인트 삭제 완료) +# 2. 슬랙 메시지의 이메일 내용: +# - 김종태님: 실제 이메일 (Google 보안알림, xAI 인보이스) +# - 전희재님: 캐시 또는 더미 데이터 추정 ``` ### 서버 작업 필요 (서버 관리자) ```sql --- 현재 상태: 0914eagle, happybell80는 refresh_token 있음 --- cdctfm은 토큰 없어 재인증 필요 +-- 실제 필요 작업: +-- 1. happybell80: 정상 동작 중 (작업 불필요) +-- 2. 0914eagle: Gmail 재인증 필요 (refresh_token 취소됨) +-- 3. cdctfm: Gmail 신규 인증 필요 (token 없음) --- is_equipped 설정 (토큰 있는 사용자만) +-- DB 정합성 수정 UPDATE gmail_token -SET is_equipped = true -WHERE slack_user_id IN ('0914eagle', 'happybell80'); - --- cdctfm은 Gmail 재인증 필요 +SET is_equipped = false +WHERE slack_user_id IN ('0914eagle', 'cdctfm'); ``` ## 5. 교훈 -1. **DB 현황**: gmail_token 테이블 3건 (2명 토큰 보유, 1명 없음) -2. **토큰 상태**: 전원 access_token 만료, refresh_token 자동 갱신 필요 -3. **auth-server**: gmail_tokens와 gmail_token 혼용 중 -4. **해결 방법**: is_equipped=true 설정 + refresh 로직 활용 \ No newline at end of file +1. **실제 결과**: happybell80만 성공, 나머지 2명 재인증 필요 +2. **refresh_token revoked**: Google이 토큰 취소 → 재인증만 해결책 +3. **슬랙 메시지 모순**: 실패했는데 이메일 내용 표시 → 캐시/더미 데이터 +4. **DB 정합성**: is_equipped=true이지만 실제 토큰 상태와 불일치 \ No newline at end of file