DOCS/troubleshooting/251114_gmail_calendar_scope_reconnect_guide.md
2025-11-16 09:06:10 +09:00

111 lines
2.9 KiB
Markdown

# Gmail Calendar Scope 및 Timezone 트러블슈팅
**작성일**: 2025-11-14 ~ 2025-11-16
**작성자**: Claude
---
## 1. Calendar Scope 추가 (2025-11-14)
### 문제
- skill-calendar가 Google Calendar API 호출 시 `invalid_grant` 에러
- 원인: Gmail Passport scope에 Calendar API 권한 없음
### 해결
**auth-server scope 수정** (`app/providers/gmail_passport.py`):
```python
GMAIL_API_SCOPES = [
"https://www.googleapis.com/auth/gmail.send",
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/gmail.modify",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/calendar", # 추가
"https://www.googleapis.com/auth/calendar.events" # 추가
]
```
**재배포 및 재인증**:
```bash
cd /home/admin/auth-server
git add app/providers/gmail_passport.py
git commit -m "feat: Calendar scope 추가"
git push origin main
```
웹에서 Gmail 재인증 → Google 권한 동의 → Calendar scope 확인 → 허용
---
## 2. Calendar CRUD Timezone 이슈 (2025-11-16)
### 문제
- **CREATE**: 성공
- **READ**: 방금 등록한 일정 조회 실패
- **DELETE**: 성공하지만 잘못된 날짜 표시
### 원인
naive datetime (timezone 없음) 사용:
```python
# 문제
start_iso = f"{date}T{start_hour}:{start_min}:00" # "2025-11-17T15:00:00"
# Google Calendar API는 timezone 없으면 해석 불확실
# rb8001 → skill-calendar 전송 시 timezone 불일치
```
### 해결
**rb8001/app/router/calendar_handler.py 수정**:
**parse_time_range()** (Line 397):
```python
from datetime import datetime
from zoneinfo import ZoneInfo
year, month, day = map(int, date.split('-'))
tz = ZoneInfo("Asia/Seoul")
start_dt = datetime(year, month, day, int(start_hour), int(start_min), 0, tzinfo=tz)
end_dt = datetime(year, month, day, int(end_hour), int(end_min), 0, tzinfo=tz)
return start_dt.isoformat(), end_dt.isoformat()
# "2025-11-17T15:00:00+09:00"
```
**handle_calendar_query()** (Line 228):
```python
today = datetime.now(ZoneInfo("Asia/Seoul"))
target_date = datetime(year, month, day, tzinfo=ZoneInfo("Asia/Seoul"))
```
### 테스트 결과
**Before (67%)**:
- ✅ CREATE
- ❌ READ (조회 실패)
- ✅ DELETE
**After (100%)**:
- ✅ CREATE
- ✅ READ (조회 성공)
- ✅ DELETE (정확한 날짜 표시)
---
## 3. 교훈
### Datetime 규칙
- **절대 금지**: naive datetime (timezone 없음)
- **필수**: `datetime.now(ZoneInfo("Asia/Seoul"))`
- **전송**: ISO 8601 with timezone (`2025-11-17T15:00:00+09:00`)
### Microservice 간 통신
- 모든 datetime은 timezone offset 포함
- UTC 통일 또는 명시적 timezone 사용
- 컨테이너 시스템 timezone 확인: `docker exec [컨테이너] date`
---
## 4. 관련 커밋
- `4cd0990`: fix: Add timezone awareness to calendar operations
- `fd7ec1c`: Revert README.md documentation changes