from fastapi import Request, HTTPException, status from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from jose import jwt, JWTError, ExpiredSignatureError from config import settings security = HTTPBearer(auto_error=False) async def verify_token(request: Request) -> dict: """JWT 토큰 검증. SSO 서비스와 동일한 시크릿 사용.""" auth: HTTPAuthorizationCredentials = await security(request) if not auth: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Authorization 헤더가 필요합니다") if not settings.SECRET_KEY: raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="서버 인증 설정 오류") try: payload = jwt.decode(auth.credentials, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) return payload except ExpiredSignatureError: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="토큰이 만료되었습니다") except JWTError: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="유효하지 않은 토큰입니다")