59 lines
2.0 KiB
Python
59 lines
2.0 KiB
Python
"""
|
|
카카오 OAuth API 클라이언트
|
|
"""
|
|
|
|
import aiohttp
|
|
|
|
from app.utils.logger import get_logger
|
|
from config import kakao_settings
|
|
|
|
logger = get_logger("kakao")
|
|
|
|
|
|
class KakaoOAuthClient:
|
|
"""카카오 OAuth API 클라이언트"""
|
|
|
|
AUTH_URL = "https://kauth.kakao.com/oauth/authorize"
|
|
TOKEN_URL = "https://kauth.kakao.com/oauth/token"
|
|
USER_INFO_URL = "https://kapi.kakao.com/v2/user/me"
|
|
|
|
def __init__(self):
|
|
self.client_id = kakao_settings.KAKAO_CLIENT_ID
|
|
self.client_secret = kakao_settings.KAKAO_CLIENT_SECRET
|
|
self.redirect_uri = kakao_settings.KAKAO_REDIRECT_URI
|
|
|
|
def get_authorization_url(self) -> str:
|
|
"""카카오 로그인 페이지 URL 반환"""
|
|
return (
|
|
f"{self.AUTH_URL}"
|
|
f"?client_id={self.client_id}"
|
|
f"&redirect_uri={self.redirect_uri}"
|
|
f"&response_type=code"
|
|
)
|
|
|
|
async def get_access_token(self, code: str) -> dict:
|
|
"""인가 코드로 액세스 토큰 획득"""
|
|
async with aiohttp.ClientSession() as session:
|
|
data = {
|
|
"grant_type": "authorization_code",
|
|
"client_id": self.client_id,
|
|
"client_secret": self.client_secret,
|
|
"redirect_uri": self.redirect_uri,
|
|
"code": code,
|
|
}
|
|
logger.debug(f"Token request - client_id: {self.client_id}, redirect_uri: {self.redirect_uri}")
|
|
async with session.post(self.TOKEN_URL, data=data) as response:
|
|
result = await response.json()
|
|
logger.debug(f"Token response: {result}")
|
|
return result
|
|
|
|
async def get_user_info(self, access_token: str) -> dict:
|
|
"""액세스 토큰으로 사용자 정보 조회"""
|
|
async with aiohttp.ClientSession() as session:
|
|
headers = {"Authorization": f"Bearer {access_token}"}
|
|
async with session.get(self.USER_INFO_URL, headers=headers) as response:
|
|
return await response.json()
|
|
|
|
|
|
kakao_client = KakaoOAuthClient()
|