Slack 문서 분리 - 봇 설치와 토큰 문제 구분
- 250902: Company-X 봇 설치 성공으로 마무리 - 250903: 멀티 워크스페이스 토큰 관리 문제로 분리 - 봇 토큰 노출 제거
This commit is contained in:
parent
1c5c876608
commit
961baedfe8
@ -199,7 +199,7 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read
|
|||||||
- slack_workspaces: T097FCTDVEX → Company-X 연결 완료
|
- slack_workspaces: T097FCTDVEX → Company-X 연결 완료
|
||||||
- 봇 설치 준비 완료
|
- 봇 설치 준비 완료
|
||||||
|
|
||||||
## 6. Company-X 봇 설치 완료 및 토큰 문제 (2025-09-02 23:00)
|
## 6. Company-X 봇 설치 완료 (2025-09-02 23:00)
|
||||||
|
|
||||||
### 6.1 설치 완료 정보
|
### 6.1 설치 완료 정보
|
||||||
**Company-X 봇 설치 성공:**
|
**Company-X 봇 설치 성공:**
|
||||||
@ -207,77 +207,16 @@ im:read, im:history, users:read, team:read, files:read, app_mentions:read
|
|||||||
- Team Name: COMPANY X
|
- Team Name: COMPANY X
|
||||||
- Bot User ID: U09DWLARFQQ
|
- Bot User ID: U09DWLARFQQ
|
||||||
- App ID: A092HLQA1NW
|
- App ID: A092HLQA1NW
|
||||||
- Bot Token: xoxb-9253435471507-9253533160819-2zZNbJaxdJcQjhJAG8t0TQFi
|
- Bot Token: 저장 완료
|
||||||
- 11개 권한 모두 부여됨
|
- 11개 권한 모두 부여됨
|
||||||
|
|
||||||
### 6.2 멀티 워크스페이스 토큰 관리 문제
|
**결과:**
|
||||||
|
- 봇 설치 프로세스 정상 완료
|
||||||
|
- slack_workspaces 테이블에 저장됨
|
||||||
|
- Event URL 수동 등록 필요
|
||||||
|
|
||||||
**문제 발견:**
|
---
|
||||||
- rb8001 컨테이너가 단일 SLACK_BOT_TOKEN 환경변수 사용
|
|
||||||
- 디지털비잉_로빙 토큰: xoxb-9073915808149-...
|
|
||||||
- Company-X 토큰: xoxb-9253435471507-...
|
|
||||||
- 현재 rb8001에 디지털비잉_로빙 토큰만 설정되어 있음
|
|
||||||
|
|
||||||
**증상:**
|
## 7. 후속 작업
|
||||||
- Company-X에서 메시지 수신은 정상
|
- 멀티 워크스페이스 토큰 관리 문제는 별도 문서 참조
|
||||||
- 응답 시도 시 실패: `Failed to send final response: The request to the Slack API failed`
|
- 참고: [250903_slack_multi_workspace_token_issue.md](./250903_slack_multi_workspace_token_issue.md)
|
||||||
- 원인: 잘못된 토큰으로 응답 시도
|
|
||||||
|
|
||||||
**실제 에러 로그:**
|
|
||||||
```
|
|
||||||
ERROR:app.router.slack_handler:Failed to send final response: The request to the Slack API failed. (url: https://www.slack.com/api/chat.postMessage)
|
|
||||||
The server responded with: {'ok': False, 'error': 'channel_not_found'}
|
|
||||||
```
|
|
||||||
|
|
||||||
**상세 분석:**
|
|
||||||
1. 이벤트 수신 ✅
|
|
||||||
- U09BQSN72UT(김종태)가 봇 멘션: `<@U09DWLARFQQ> 하이`
|
|
||||||
- app_mention 이벤트 정상 수신
|
|
||||||
|
|
||||||
2. 처리 과정 ✅
|
|
||||||
- UUID 변환 성공 (U09BQSN72UT → 1a7ebe8c-1cfd-4acf-a821-2cc526313706)
|
|
||||||
- 응답 생성 성공: "김종태님, 안녕하세요! 로빙입니다. 무엇을 도와드릴까요?"
|
|
||||||
- ChromaDB/PostgreSQL 저장 성공
|
|
||||||
|
|
||||||
3. 응답 전송 실패 ❌
|
|
||||||
- `channel_not_found` 에러
|
|
||||||
- 디지털비잉_로빙 토큰으로 Company-X 채널 접근 불가
|
|
||||||
|
|
||||||
### 6.3 Event URL 라우팅 구조
|
|
||||||
|
|
||||||
**정상 작동 확인:**
|
|
||||||
1. Slack → `https://ro-being.com/rb8001/api/slack/events`
|
|
||||||
2. nginx 프록시 → `192.168.219.52:8001/api/slack/events`
|
|
||||||
3. rb8001 컨테이너가 이벤트 수신 및 처리
|
|
||||||
|
|
||||||
**문제점:**
|
|
||||||
- rb8001이 단일 토큰만 사용 가능한 구조
|
|
||||||
- 멀티 워크스페이스 지원을 위해서는 토큰 동적 선택 로직 필요
|
|
||||||
|
|
||||||
### 6.4 해결 방안
|
|
||||||
|
|
||||||
**단기 해결:**
|
|
||||||
- 워크스페이스별로 별도 컨테이너 운영
|
|
||||||
- 또는 team_id 기반으로 토큰 동적 선택 로직 구현
|
|
||||||
|
|
||||||
**장기 해결:**
|
|
||||||
- auth-server의 중앙 라우터 활용
|
|
||||||
- `/slack/events/router`가 team_id별로 적절한 컨테이너로 라우팅
|
|
||||||
- 각 컨테이너는 해당 워크스페이스 토큰만 보유
|
|
||||||
|
|
||||||
### 6.5 Slack App Manifest Event URL 설정
|
|
||||||
|
|
||||||
**올바른 Event URL (Slack App에 설정해야 함):**
|
|
||||||
```json
|
|
||||||
"event_subscriptions": {
|
|
||||||
"request_url": "https://ro-being.com/rb8001/api/slack/events"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
- rb8001이 직접 이벤트 수신
|
|
||||||
- URL verification 정상 응답 확인됨
|
|
||||||
- nginx 프록시 → 51124:8001 정상 작동
|
|
||||||
|
|
||||||
**주의사항:**
|
|
||||||
- Slack App 설정에서 직접 Event URL 등록 필요
|
|
||||||
- 봇 설치와 Event URL 등록은 별개 프로세스
|
|
||||||
- team_id 기반 토큰 동적 선택 로직 구현 필요
|
|
||||||
58
troubleshooting/250903_slack_multi_workspace_token_issue.md
Normal file
58
troubleshooting/250903_slack_multi_workspace_token_issue.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Slack 멀티 워크스페이스 토큰 관리 문제
|
||||||
|
|
||||||
|
## 작성일: 2025-09-03
|
||||||
|
## 작성자: 51123 서버 관리자
|
||||||
|
## 상태: 🔴 해결 필요
|
||||||
|
## 영향: Company-X 워크스페이스 응답 실패
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 문제 상황
|
||||||
|
- **현상**: Company-X에서 메시지 수신은 정상, 응답 전송 실패
|
||||||
|
- **원인**: rb8001이 단일 SLACK_BOT_TOKEN 환경변수만 사용
|
||||||
|
- **에러**: `channel_not_found` - 잘못된 토큰으로 채널 접근
|
||||||
|
|
||||||
|
## 2. 토큰 현황
|
||||||
|
- **디지털비잉_로빙**: xoxb-9073915808149-... (현재 rb8001에 설정)
|
||||||
|
- **Company-X**: xoxb-9253435471507-... (DB에 저장됨)
|
||||||
|
- **문제**: 디지털비잉 토큰으로 Company-X 채널 접근 시도
|
||||||
|
|
||||||
|
## 3. 상세 분석
|
||||||
|
|
||||||
|
### 3.1 이벤트 수신 (✅ 정상)
|
||||||
|
- U09BQSN72UT(김종태) 봇 멘션: `<@U09DWLARFQQ> 하이`
|
||||||
|
- app_mention 이벤트 정상 수신
|
||||||
|
|
||||||
|
### 3.2 처리 과정 (✅ 정상)
|
||||||
|
- UUID 변환 성공
|
||||||
|
- 응답 생성 성공: "김종태님, 안녕하세요! 로빙입니다."
|
||||||
|
- ChromaDB/PostgreSQL 저장 성공
|
||||||
|
|
||||||
|
### 3.3 응답 전송 (❌ 실패)
|
||||||
|
```
|
||||||
|
ERROR: Failed to send final response: The request to the Slack API failed.
|
||||||
|
The server responded with: {'ok': False, 'error': 'channel_not_found'}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. 해결 방안
|
||||||
|
|
||||||
|
### 4.1 단기 해결
|
||||||
|
- team_id 기반 토큰 동적 선택 로직 구현
|
||||||
|
- slack_workspaces 테이블에서 bot_token 조회
|
||||||
|
|
||||||
|
### 4.2 장기 해결
|
||||||
|
- auth-server의 중앙 라우터 활용
|
||||||
|
- `/slack/events/router`가 team_id별 컨테이너 라우팅
|
||||||
|
- 각 컨테이너는 해당 워크스페이스 토큰만 보유
|
||||||
|
|
||||||
|
## 5. 구현 필요 코드 (로컬 개발자)
|
||||||
|
```python
|
||||||
|
# rb8001에서 team_id로 토큰 조회
|
||||||
|
async def get_bot_token(team_id: str):
|
||||||
|
# slack_workspaces 테이블에서 토큰 조회
|
||||||
|
result = await db.fetch_one(
|
||||||
|
"SELECT bot_token FROM slack_workspaces WHERE team_id = :team_id",
|
||||||
|
{"team_id": team_id}
|
||||||
|
)
|
||||||
|
return result["bot_token"] if result else None
|
||||||
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user