- 3539a2b 커밋 기록 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
99 lines
3.8 KiB
Markdown
99 lines
3.8 KiB
Markdown
# OAuth 다중 프로바이더 지원 구현
|
|
|
|
## 작성일: 2025-10-13
|
|
## 작성자: happybell80
|
|
|
|
---
|
|
|
|
## 현재 상황
|
|
|
|
### user 테이블 스키마
|
|
- oauth_provider VARCHAR(50)
|
|
- oauth_id VARCHAR(255)
|
|
- 한 사용자당 하나의 OAuth 프로바이더만 저장 가능
|
|
|
|
### 코드 위치
|
|
- robeing-gateway/app/database.py:353,368-369 - slack_user_to_uuid
|
|
- robeing-gateway/app/models.py:22-23 - User 모델
|
|
- auth-server/app/providers/slack.py:275-276,287-288 - Slack OAuth
|
|
- auth-server/app/providers/gmail.py:164-165,174-175 - Google OAuth
|
|
- auth-server/app/providers/naverworks.py:225-226,233-234,243-244 - NaverWorks OAuth
|
|
- auth-server/app/models/user.py:26-27 - User 모델
|
|
|
|
### 문제
|
|
auth-server/app/providers/slack.py:287-288에서 기존 사용자의 oauth_provider를 덮어씀:
|
|
- 사용자가 Google로 먼저 로그인 → oauth_provider='google'
|
|
- 같은 사용자가 Slack으로 로그인 → oauth_provider='slack'으로 덮어씀
|
|
- Google 정보 손실, Slack으로만 로그인 가능
|
|
|
|
---
|
|
|
|
## 해결 방법
|
|
|
|
### 1단계: JSONB 컬럼 추가 (기존 컬럼 유지)
|
|
- ALTER TABLE "user" ADD COLUMN oauth_providers JSONB DEFAULT '{}'
|
|
|
|
### 2단계: 기존 데이터 변환
|
|
- UPDATE "user" SET oauth_providers = json_build_object(oauth_provider, oauth_id)::jsonb WHERE oauth_id IS NOT NULL
|
|
- 예시: {"slack": "U0925SXQFDK"} 또는 {"google": "100176844464607664427"} 또는 {"naverworks": "user_id"}
|
|
|
|
### 3단계: 코드 수정 (6개 파일)
|
|
|
|
#### robeing-gateway
|
|
- app/database.py:368-369 - oauth_providers->>'slack' 쿼리로 변경
|
|
- app/models.py:22-23 - oauth_providers JSONB 추가
|
|
|
|
#### auth-server
|
|
- app/providers/slack.py:275-276,287-288 - oauth_providers JSONB 병합
|
|
- app/providers/gmail.py:164-165,174-175 - oauth_providers JSONB 병합
|
|
- app/providers/naverworks.py:225-226,233-234,243-244 - oauth_providers JSONB 병합
|
|
- app/models/user.py:26-27 - oauth_providers JSONB 추가
|
|
|
|
### 4단계: B-tree 인덱스 추가
|
|
- CREATE INDEX idx_user_oauth_slack ON "user" ((oauth_providers->>'slack'))
|
|
- CREATE INDEX idx_user_oauth_google ON "user" ((oauth_providers->>'google'))
|
|
- CREATE INDEX idx_user_oauth_naverworks ON "user" ((oauth_providers->>'naverworks'))
|
|
|
|
### 5단계: 테스트 후 기존 컬럼 제거
|
|
- ALTER TABLE "user" DROP COLUMN oauth_provider, DROP COLUMN oauth_id
|
|
|
|
---
|
|
|
|
## 구현 순서
|
|
1. 1단계 실행 (JSONB 컬럼 추가)
|
|
2. 2단계 실행 (데이터 변환)
|
|
3. 3단계 실행 (코드 수정 6개 파일)
|
|
4. 테스트 (Google → Slack → NaverWorks 순차 로그인)
|
|
5. 4단계 실행 (인덱스 추가)
|
|
6. 5단계 실행 (기존 컬럼 제거)
|
|
|
|
---
|
|
|
|
## 구현 완료 (2025-10-13)
|
|
|
|
### DB 마이그레이션 (23서버)
|
|
- ✅ 1-2단계: oauth_providers JSONB 컬럼 추가, 기존 11개 사용자 데이터 변환
|
|
- ✅ 4단계: B-tree 인덱스 3개 생성 (slack, google, naverworks)
|
|
|
|
### 코드 수정
|
|
- ✅ robeing-gateway (231f92b, 3539a2b): app/database.py:368, app/models.py:22-23
|
|
- ✅ auth-server (e527eaa): app/models/user.py:28, app/providers/*.py (slack, gmail, naverworks)
|
|
|
|
### 테스트 결과
|
|
- ✅ Slack 사용자 UUID 변환 성공
|
|
- ✅ rb8001 프록시 전달 성공 (HTTP 200 OK)
|
|
- ✅ 로빙 봇 메시지 필터링 성공
|
|
|
|
### 잔여 참조 정리 완료
|
|
- ✅ robeing-gateway (50f48ab): app/main.py:481
|
|
- ✅ skill-email (8e1f0cf): db_credentials_provider.py:81,195,264, naverworks_provider.py:50
|
|
|
|
### 최종 정리: 모델 및 생성자 정리 완료 (2025-10-13)
|
|
- ✅ DB에서 oauth_provider, oauth_id 컬럼 삭제 완료 (서버 23)
|
|
- ✅ auth-server (2e6968c): 모델 정의 및 User() 생성자에서 oauth_provider, oauth_id 제거
|
|
- app/models/user.py:26-28 - 컬럼 정의 제거
|
|
- app/providers/slack.py:306-308 - User() 생성자
|
|
- app/providers/gmail.py:164-165 - User() 생성자
|
|
- app/providers/naverworks.py:245-246 - User() 생성자
|
|
- app/providers/naverworks_passport.py:261 - 쿼리 변경 (oauth_providers->>'naverworks')
|