feat: 카카오 로그인 마이페이지 조회 + scope/env 수정 + 트러블슈팅 문서
- 마이페이지에 카카오 로그인 조회 기능 추가 (/my-page/kakao/start) - 콜백 핸들러에 purpose=mypage 분기 추가 (동일 콜백 URL 재사용) - my_page_login.html에 "카카오로 조회하기" 버튼 추가 - my_page.html 헤더에 카카오 조회 버튼 추가 - OAuth scope에서 name, phone_number 제거 (비즈앱 심사 미완료) - KOE101/KOE205/KOE320 등 에러별 트러블슈팅 문서 작성 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -745,6 +745,40 @@ def claim_kakao_start():
|
||||
return redirect(auth_url)
|
||||
|
||||
|
||||
def _handle_mypage_kakao_callback(code, kakao_client):
|
||||
"""마이페이지 카카오 콜백 처리 - 카카오 ID로 유저 조회 후 마이페이지 이동"""
|
||||
success, token_data = kakao_client.get_access_token(code)
|
||||
if not success:
|
||||
return render_template('error.html', message="카카오 인증에 실패했습니다.")
|
||||
|
||||
access_token = token_data.get('access_token')
|
||||
success, user_info = kakao_client.get_user_info(access_token)
|
||||
if not success:
|
||||
return render_template('error.html', message="카카오 사용자 정보를 가져올 수 없습니다.")
|
||||
|
||||
kakao_id = user_info.get('kakao_id')
|
||||
kakao_phone_raw = user_info.get('phone_number')
|
||||
kakao_phone = normalize_kakao_phone(kakao_phone_raw)
|
||||
|
||||
# 1) 카카오 ID로 기존 유저 조회
|
||||
existing_user_id = find_user_by_kakao_id(kakao_id)
|
||||
if existing_user_id:
|
||||
conn = db_manager.get_sqlite_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT phone FROM users WHERE id = ?", (existing_user_id,))
|
||||
row = cursor.fetchone()
|
||||
if row:
|
||||
return redirect(f"/my-page?phone={row['phone']}")
|
||||
|
||||
# 2) 카카오에서 전화번호를 받은 경우
|
||||
if kakao_phone:
|
||||
return redirect(f"/my-page?phone={kakao_phone}")
|
||||
|
||||
# 3) 둘 다 없으면 전화번호 입력 안내
|
||||
return render_template('error.html',
|
||||
message="카카오 계정에 연결된 적립 정보가 없습니다. 전화번호로 조회해주세요.")
|
||||
|
||||
|
||||
@app.route('/claim/kakao/callback')
|
||||
def claim_kakao_callback():
|
||||
"""카카오 OAuth 콜백 - 토큰 교환 → 사용자 정보 → 적립 처리"""
|
||||
@@ -772,6 +806,10 @@ def claim_kakao_callback():
|
||||
if csrf_token != session.pop('kakao_csrf', None):
|
||||
return render_template('error.html', message="보안 검증에 실패했습니다. 다시 시도해주세요.")
|
||||
|
||||
# 2.5 마이페이지 조회 목적이면 별도 처리
|
||||
if state_data.get('purpose') == 'mypage':
|
||||
return _handle_mypage_kakao_callback(code, get_kakao_client())
|
||||
|
||||
# 3. claim 컨텍스트 복원
|
||||
token_param = state_data.get('t', '')
|
||||
parts = token_param.split(':')
|
||||
@@ -894,6 +932,28 @@ def api_claim_kakao():
|
||||
})
|
||||
|
||||
|
||||
@app.route('/my-page/kakao/start')
|
||||
def mypage_kakao_start():
|
||||
"""마이페이지 카카오 로그인 조회"""
|
||||
from services.kakao_client import get_kakao_client
|
||||
|
||||
csrf_token = secrets.token_hex(16)
|
||||
state_data = {
|
||||
'purpose': 'mypage',
|
||||
'csrf': csrf_token
|
||||
}
|
||||
state_encoded = base64.urlsafe_b64encode(
|
||||
json.dumps(state_data).encode()
|
||||
).decode()
|
||||
|
||||
session['kakao_csrf'] = csrf_token
|
||||
|
||||
kakao_client = get_kakao_client()
|
||||
auth_url = kakao_client.get_authorization_url(state=state_encoded)
|
||||
|
||||
return redirect(auth_url)
|
||||
|
||||
|
||||
@app.route('/my-page')
|
||||
def my_page():
|
||||
"""마이페이지 (전화번호로 조회)"""
|
||||
|
||||
Reference in New Issue
Block a user