# Slack OAuth 로그인 구현 및 임시 해결책 정리

## 구현 날짜
2025년 8월 31일

## 구현 내용

### 1. Slack OIDC 로그인 기능 구현
- **엔드포인트**: `/auth/slack/login/` → `/auth/slack/login/callback`
- **인증 방식**: OAuth 2.0 with OIDC (OpenID Connect)
- **스코프**: `openid profile email` (공백 구분)
- **콜백 처리**: GET/POST 모두 지원 (Slack의 form_post 대응)

### 2. 사용자 관리 로직
- Slack에서 사용자 정보 획득 (email, name, picture, sub)
- 하이브리드 사용자 조회/생성:
  1. `slack_user_mapping` 테이블에서 기존 매핑 확인
  2. 없으면 email로 기존 사용자 검색
  3. 없으면 새 사용자 생성
- UUID를 primary key로 사용

## 임시 해결책 및 기술 부채

### 1. DB 스키마 불일치 ⚠️
**문제점**:
- `companies` 테이블과 `workspaces` 테이블이 공존
- `SlackWorkspace` 모델이 `company_id`를 참조하는데 모델은 `workspace_id` 기대
- Relationship 주석 처리로 임시 해결

**현재 상태**:
```python
# app/models/workspace.py
class SlackWorkspace(Base):
    company_id = Column(UUID, ForeignKey("companies.id"))  # 실제 DB
    # workspace_id로 되어야 하는데 companies 테이블 참조 중
    # relationship 주석 처리됨
```

**해결 방안**:
1. `companies` 테이블 데이터를 `workspaces`로 마이그레이션
2. FK 관계 정리
3. 모델 통일

### 2. Frontend-Backend 인증 방식 불일치 📝
**문제점**:
- Frontend는 Gmail 방식 (`/auth/verify`) 사용
- Slack 로그인은 원래 JWT 직접 전달 계획
- 현재 Gmail과 동일한 임시 코드 방식으로 처리

**현재 구현**:
```python
# Slack 콜백에서
temp_code = secrets.token_urlsafe(32)
await redis_client.setex(f"auth:temp:{temp_code}", 60, auth_data)
return RedirectResponse(url=f"{redirect_uri}#auth={temp_code}")

# Frontend에서
const authCode = hash.split('auth=')[1];
fetch('/auth/verify', { body: { code: authCode } })
```

**해결 방안**:
- Frontend를 JWT 직접 처리 방식으로 수정
- 또는 통합 인증 컨텍스트 구현

### 3. 하드코딩된 설정 값들 📌
**문제점**:
```python
redirect_uri = "http://localhost:3000"  # 하드코딩
login_callback_url = "https://auth.ro-being.com/auth/slack/login/callback"  # 하드코딩
```

**해결 방안**:
- 환경변수로 이동
- 동적 리다이렉트 URL 처리

### 4. OIDC vs OAuth 2.0 혼란 🔄
**시도한 방법들**:
1. OIDC (`/openid/connect/authorize`) - "Sign in with Slack" 필요
2. OAuth 2.0 User Token (`user_scope`) - 작동하지만 다른 방식
3. 최종: OIDC with form_post 지원

**주의사항**:
- Slack OIDC는 `response_modes_supported=["form_post"]`
- 콜백이 POST로 옴 (GET 아님)

## 테스트된 사항

### 성공 ✅
- Slack 로그인 플로우 완성
- 사용자 정보 정상 획득
- JWT 토큰 생성 및 발급
- Frontend localStorage 저장
- 기존 사용자 연동 (email 기준)

### 알려진 이슈 ⚠️
- 브라우저에 Slack 세션 있으면 자동 로그인
- DB relationship 에러 (주석 처리로 회피)
- Frontend 빌드 캐시 문제 (강제 새로고침 필요)

## 향후 작업

### 긴급도 높음 🔴
1. DB 스키마 통일 (companies → workspaces)
2. Frontend 인증 방식 통일

### 중간 우선순위 🟡
1. 환경변수 정리
2. 에러 처리 개선
3. 로깅 강화

### 낮은 우선순위 🟢
1. OIDC ID token 검증 (JWKS)
2. refresh token 구현
3. 로그아웃 시 Slack 세션 처리

## 관련 파일
- `/home/admin/auth-server/app/providers/slack.py`
- `/home/admin/auth-server/app/models/workspace.py`
- `/home/heejae/frontend-customer/src/contexts/auth-context.tsx`
- `/home/admin/auth-server/app/routes/auth.py`

## 참고 명령어
```bash
# Docker 재시작
cd /home/admin/auth-server
docker compose down && docker compose up -d --build

# Frontend 빌드
cd /home/heejae/frontend-customer
npm install && npm run build

# 로그 확인
docker logs auth-server --tail 50

# DB 확인
PGPASSWORD=robeings psql -h localhost -U robeings -d main_db
```