diff --git a/troubleshooting/250825_gmail_token_null_daily_briefing_fix.md b/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md similarity index 79% rename from troubleshooting/250825_gmail_token_null_daily_briefing_fix.md rename to troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md index ce05d6c..065c8ca 100644 --- a/troubleshooting/250825_gmail_token_null_daily_briefing_fix.md +++ b/troubleshooting/250825_gmail_token_expired_daily_briefing_fix.md @@ -1,4 +1,4 @@ -# Gmail 토큰 NULL 및 대화 저장 실패 문제 해결 가이드 +# Gmail 토큰 만료 및 대화 저장 실패 문제 해결 가이드 ## 작성일: 2025-08-25 ## 작성자: 서버 관리자 @@ -21,17 +21,18 @@ ### 1.2 근본 원인 ```sql --- 현재 DB 상태: 모든 사용자 token_data가 NULL -SELECT username, has_token, is_equipped +-- 현재 DB 상태: 모든 사용자 토큰 만료 +SELECT username, access_token IS NOT NULL as has_token, + expires_at < extract(epoch from now()) as is_expired FROM gmail_tokens; 결과: -happybell80 | f (NULL) | t (장착됨) -- 모순 상태 -0914eagle | f (NULL) | t (장착됨) -- 모순 상태 -cdctfm | f (NULL) | t (장착됨) -- 모순 상태 +happybell80 | t (있음) | t (만료됨) +0914eagle | t (있음) | t (만료됨) +cdctfm | t (있음) | t (만료됨) ``` -**문제**: is_equipped=true이지만 실제 token_data=NULL +**문제**: access_token은 있지만 만료되어 사용 불가 --- @@ -49,7 +50,7 @@ sequenceDiagram Cron->>RB: POST /api/cron/daily-summary RB->>Email: GET /messages?user_id={slack_id} Email->>DB: SELECT token_data FROM gmail_tokens - DB-->>Email: token_data: NULL ❌ + DB-->>Email: access_token: expired ❌ Email-->>RB: 500 Internal Server Error RB->>Slack: 불완전한 브리핑 전송
(이메일 없이 뉴스만) ``` @@ -72,7 +73,7 @@ sequenceDiagram Google->>Auth: Callback with code Auth->>Google: Exchange code for tokens Google-->>Auth: access_token, refresh_token - Auth->>DB: UPDATE gmail_tokens
SET token_data = {...} + Auth->>DB: UPDATE gmail_tokens
SET access_token, refresh_token Auth-->>Front: 인증 완료 ``` @@ -80,9 +81,12 @@ sequenceDiagram ## 3. 해결 방안 -### 3.1 해결책 - 관리자 대신 인증 +### 3.1 해결책 - 토큰 갱신 또는 재인증 ```bash -# 1. 테스트 계정으로 OAuth 인증 URL 생성 +# 1. 토큰 갱신 (만료된 경우) +curl -X POST "http://localhost:9000/api/gmail/refresh/1e16e9d5-59f3-54da-a661-8abeabff4230" + +# 2. 갱신 실패 시 OAuth 재인증 URL 생성 curl -X GET "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a661-8abeabff4230" # 2. 반환된 URL을 브라우저에서 열어 Google 로그인 @@ -91,7 +95,7 @@ curl -X GET "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a66 # 4. 토큰 저장 확인 export PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c \ - "SELECT user_id, token_data IS NOT NULL FROM gmail_tokens WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" + "SELECT user_id, access_token IS NOT NULL FROM gmail_tokens WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" # 5. 브리핑 수동 테스트 curl -X POST http://192.168.219.52:8001/api/cron/daily-summary \ @@ -115,16 +119,20 @@ curl -X POST http://192.168.219.52:8001/api/cron/daily-summary \ # 1. 토큰 상태 확인 export PGPASSWORD=robeings psql -h localhost -U robeings -d main_db -c \ - "SELECT u.username, gt.token_data IS NOT NULL as has_token, - gt.is_equipped, gt.metadata->>'email' as email + "SELECT u.username, gt.access_token IS NOT NULL as has_token, + gt.expires_at < extract(epoch from now()) as is_expired, + gt.metadata->>'email' as email FROM users u LEFT JOIN gmail_tokens gt ON u.id = gt.user_id WHERE u.username IN ('happybell80', '0914eagle', 'cdctfm');" ``` -### Step 2: 테스트 계정 인증 (15분) +### Step 2: 토큰 갱신 또는 재인증 (15분) ```bash -# 1. OAuth URL 생성 (happybell80 계정) +# 1. 토큰 갱신 시도 (happybell80 계정) +curl -X POST "http://localhost:9000/api/gmail/refresh/1e16e9d5-59f3-54da-a661-8abeabff4230" + +# 2. 갱신 실패 시 OAuth URL 생성 curl -s "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a661-8abeabff4230" | jq -r '.auth_url' # 2. 브라우저에서 URL 열고 Google 계정으로 로그인 @@ -132,7 +140,7 @@ curl -s "http://localhost:9000/api/gmail/auth?user_id=1e16e9d5-59f3-54da-a661-8a # 4. 인증 성공 확인 psql -h localhost -U robeings -d main_db -c \ - "SELECT token_data->'access_token' IS NOT NULL as success + "SELECT access_token IS NOT NULL as success FROM gmail_tokens WHERE user_id = '1e16e9d5-59f3-54da-a661-8abeabff4230';" ``` @@ -164,7 +172,7 @@ curl -s "http://localhost:9000/api/gmail/auth?user_id=69ae4ea9-a15f-5110-9f5d-65 ## 5. 검증 체크리스트 -- [ ] 모든 사용자의 token_data NOT NULL 확인 +- [ ] 모든 사용자의 access_token 유효성 확인 - [ ] 수동 브리핑 실행 시 이메일 포함 확인 - [ ] Slack DM으로 완전한 브리핑 수신 확인 @@ -221,5 +229,5 @@ DATABASE_URL=postgresql://robeings:robeings@192.168.219.45:5432/main_db ## 예상 소요 시간: 1시간 30분 -- Gmail 토큰 문제: 1시간 +- Gmail 토큰 갱신: 10분 - ~~State Service DB 설정~~: 필요 없음 (직접 DB 연결) \ No newline at end of file