diff --git a/plans/250918_skill_email_naverworks_extension.md b/plans/250918_skill_email_naverworks_extension.md index 2ea4254..78b6880 100644 --- a/plans/250918_skill_email_naverworks_extension.md +++ b/plans/250918_skill_email_naverworks_extension.md @@ -165,21 +165,21 @@ POST /v2/mail-summary - **수명**: Access Token 1시간, Refresh Token 90일 - **위험**: DB 저장 실패 시 영구 토큰 손실, 재인증 필요 -### 8.2 구현 위치 결정 -**auth-server에서 중앙 관리 (정답)** -``` -/home/admin/auth-server/app/providers/ -└── naverworks_refresh.py # 토큰 갱신 전용 모듈 -``` +### 8.2 구현 위치 (결정 완료) +**auth-server에서 중앙 관리** +- 위치: `/home/admin/auth-server/app/providers/naverworks_refresh.py` (생성 필요) +- 포트: 9000 +- 엔드포인트: **결정 필요** - `/auth/naverworks/refresh` 또는 `/api/auth/naverworks/refresh` -**역할 분리**: -- auth-server: 모든 토큰 발급/갱신/저장 (포트 9000) -- rb8001/skill-email: API 호출만, 401 시 auth-server에 갱신 요청 -- 엔드포인트: `POST /auth/naverworks/refresh` +### 8.3 현재 인프라 상태 (확인 완료) +- Redis 컨테이너: 실행 중 (6f083213a8b1) +- auth-server 컨테이너: 실행 중 (dba7eb03216a) +- 현재 토큰 상태: Access Token 만료 (4시간 경과), Refresh Token 보유 +- DB 필드: token_data (JSONB), expires_at, expiry 존재 (**확인 필요**: 어느 필드 사용?) -### 8.3 동시성 제어 -- Redis Lock 또는 DB 트랜잭션으로 동시 갱신 방지 -- 첫 번째 갱신만 성공, 나머지는 대기 또는 실패 처리 +### 8.4 동시성 제어 +- **확인 필요**: Redis Lock 구현 여부 +- **결정 필요**: DB 트랜잭션 vs Redis Lock --- diff --git a/troubleshooting/250917_네이버웍스_passport_작업.md b/troubleshooting/250917_네이버웍스_passport_작업.md index bfd915b..25ffaa3 100644 --- a/troubleshooting/250917_네이버웍스_passport_작업.md +++ b/troubleshooting/250917_네이버웍스_passport_작업.md @@ -45,38 +45,46 @@ app.include_router(naverworks_passport.router, prefix="/auth/naverworks/passport - 로그인 시 `is_equipped=false`로 설정 (Passport 설치 시 `true`) - 토큰 저장 실패해도 로그인은 계속 진행 -### 3. DB 스키마 +### 3. DB 스키마 (실제 확인) **테이블명**: `naverworks_token` | 컬럼명 | 타입 | 설명 | |--------|------|------| -| user_id | UUID (PK) | user 테이블 FK | +| id | UUID (PK) | gen_random_uuid() | +| user_id | UUID | user 테이블 FK | | username | VARCHAR(255) | 빠른 조회용 | | domain_id | VARCHAR(255) | NAVER WORKS 도메인 ID | | account_id | VARCHAR(255) | NAVER WORKS 계정 ID | -| token_data | JSONB | access_token, refresh_token, token_type | +| access_token | TEXT | **확인 필요**: 사용 여부 | +| refresh_token | TEXT | **확인 필요**: 사용 여부 | +| token_type | VARCHAR(50) | 기본값: 'Bearer' | +| token_data | JSONB | access_token, refresh_token 저장 | | oauth_config | JSONB | client_id, client_secret | | scopes | JSONB | 권한 목록 | | metadata | JSONB | email, name, org_name 등 | -| expiry | TIMESTAMP | access_token 만료 시간 | -| is_equipped | BOOLEAN | 활성화 상태 | -| created_at | TIMESTAMP | 생성 시각 | -| updated_at | TIMESTAMP | 수정 시각 | +| expires_at | TIMESTAMP | **확인 필요**: expiry와 중복? | +| expiry | TIMESTAMP | **확인 필요**: expires_at와 중복? | +| service_account | VARCHAR(255) | Service Account ID | +| is_equipped | BOOLEAN | 기본값: false | +| created_at | TIMESTAMPTZ | 생성 시각 | +| updated_at | TIMESTAMPTZ | 수정 시각 | + +**인덱스**: +- PRIMARY KEY: id +- idx_naverworks_token_user_id +- idx_naverworks_token_expires_at ### 4. 환경변수 설정 -#### 필수 환경변수 (.env 파일) -```bash -# NAVER WORKS OAuth 설정 (이미 존재) -NAVER_WORKS_CLIENT_ID= -NAVER_WORKS_CLIENT_SECRET= -NAVER_WORKS_TENANT_ID=<조직 도메인 ID> -NAVER_WORKS_SERVICE_ACCOUNT= -NAVER_WORKS_PRIVATE_KEY_BASE64= - -# Passport Redirect URL (추가됨) -NAVER_WORKS_PASSPORT_REDIRECT_URI=https://auth.ro-being.com/auth/naverworks/passport/callback -``` +#### 환경변수 (확인 완료) +- NAVER_WORKS_CLIENT_ID +- NAVER_WORKS_CLIENT_SECRET +- NAVER_WORKS_REDIRECT_URI +- NAVER_WORKS_SERVICE_ACCOUNT +- NAVER_WORKS_TENANT_ID +- NAVER_WORKS_PRIVATE_KEY_BASE64 +- NAVER_WORKS_SCOPES +- NAVER_WORKS_PASSPORT_REDIRECT_URI ## ⚠️ 확인 필요 사항 diff --git a/troubleshooting/250917_네이버웍스_캘린더_API_연동_가이드.md b/troubleshooting/250917_네이버웍스_캘린더_API_연동_가이드.md index 0cfac11..11c3fcb 100644 --- a/troubleshooting/250917_네이버웍스_캘린더_API_연동_가이드.md +++ b/troubleshooting/250917_네이버웍스_캘린더_API_연동_가이드.md @@ -54,6 +54,11 @@ - `/auth/naverworks/passport/callback` - Passport 콜백 - `/auth/naverworks/passport/status` - Passport 상태 확인 +**Phase 3 - 토큰 갱신 엔드포인트** (구현 필요): +- **결정 필요**: `/auth/naverworks/refresh` 또는 `/api/auth/naverworks/refresh` +- 파일 생성 필요: `naverworks_refresh.py` +- Refresh Token Rotation 처리 필요 + **외부 OAuth URL**: - **Authorization**: `https://auth.worksmobile.com/oauth2/v2.0/authorize` - **Token**: `https://auth.worksmobile.com/oauth2/v2.0/token`