diff --git a/troubleshooting/250903_slack_multi_workspace_token_issue.md b/troubleshooting/250903_slack_multi_workspace_token_issue.md index 3c51ca1..110a810 100644 --- a/troubleshooting/250903_slack_multi_workspace_token_issue.md +++ b/troubleshooting/250903_slack_multi_workspace_token_issue.md @@ -38,50 +38,46 @@ The server responded with: {'ok': False, 'error': 'channel_not_found'} ## 4. 해결 방안 (2025-09-03 확정) -### 4.1 Gateway 경유 방식 채택 -- Slack Event URL을 Gateway(8100)로 변경 -- Gateway에서 team_id별 토큰 조회 및 주입 -- rb8001은 헤더에서 토큰 읽어 사용 +### 4.1 기존 코드 활용 +- **Gateway**: items_proxy, chat_proxy 패턴 재사용 +- **rb8001**: 최소 수정 (라인 21, 98만) +- **skill-slack**: 제거 (8/12 이후 미사용) -### 4.2 구현 상세 -1. **nginx 설정**: `/api/*` → Gateway(8100) 프록시 -2. **Slack App**: Event URL을 `https://ro-being.com/api/slack/events`로 변경 -3. **Gateway**: team_id로 DB 조회, 헤더에 토큰 추가 -4. **rb8001**: 헤더 우선, 환경변수 폴백 +### 4.2 구현 단계 +1. **nginx**: `/api/` location 추가 +2. **Gateway**: slack_proxy 함수 (get_verified_user 스킵) +3. **rb8001**: 헤더 토큰 읽기 추가 +4. **Slack App**: Event URL 변경 ## 5. 구현 필요 코드 (로컬 개발자) -### 5.1 Gateway 추가 (robeing-gateway) +### 5.1 Gateway (기존 proxy 패턴 활용) ```python -@app.post("/api/slack/events") -async def handle_slack_event(request: Request): - # Slack 서명 검증 - verify_slack_signature(request) - - # team_id별 토큰 조회 +# 기존 items_proxy, chat_proxy와 동일 패턴 +async def slack_proxy(request: Request): + # get_verified_user() 스킵 (/api/slack/* 경로) body = await request.json() team_id = body.get("team_id") - result = await db.fetch_one( - "SELECT bot_token FROM slack_workspaces WHERE team_id = :team_id", - {"team_id": team_id} + # DB 조회 (team_id 인덱스 활용) + token = await db.fetch_one( + "SELECT bot_token FROM slack_workspaces WHERE team_id = ?", + team_id ) - # rb8001로 전달 - headers = { - "X-Slack-Bot-Token": result["bot_token"] if result else None, - "Content-Type": "application/json" - } - - return await forward_to_rb8001("/api/slack/events", body, headers) + headers = {"X-Slack-Bot-Token": token["bot_token"]} + return await httpx.post("http://192.168.219.52:8001/api/slack/events", + json=body, headers=headers) ``` -### 5.2 rb8001 수정 (slack_handler.py) -```python -# 기존: 환경변수만 사용 -slack_token = os.environ.get("SLACK_BOT_TOKEN") +### 5.2 rb8001 수정 위치 +- **slack_handler.py:21**: `settings.SLACK_BOT_TOKEN` → `request.headers.get("X-Slack-Bot-Token", settings.SLACK_BOT_TOKEN)` +- **dm_skill.py:98**: WebClient 초기화 시 헤더 토큰 우선 사용 -# 수정: 헤더 우선, 환경변수 폴백 -slack_token = request.headers.get("X-Slack-Bot-Token") \ - or os.environ.get("SLACK_BOT_TOKEN") +### 5.3 nginx 설정 추가 +```nginx +location /api/ { + proxy_pass http://localhost:8100; + proxy_set_header X-Real-IP $remote_addr; +} ``` \ No newline at end of file