성능개선 문자인증오류수정 텔레그램메시포함 등

This commit is contained in:
CPABONG 2025-08-24 18:37:15 +09:00
parent d80a0ad464
commit b2e0805880
9 changed files with 66 additions and 7 deletions

View File

@ -218,13 +218,14 @@ def send_signup_notification(name, phone, request):
send_telegram_message_async(message)
def send_password_reset_notification(phone, request):
def send_password_reset_notification(phone, request, user_exists=True):
"""
비밀번호 찾기 문자인증 요청 알림
Args:
phone (str): 전화번호
request: Django request 객체 (IP, User-Agent 정보)
user_exists (bool): 사용자가 등록되어 있는지 여부
"""
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
@ -237,10 +238,21 @@ def send_password_reset_notification(phone, request):
# 디버그 정보 출력
print(f"[TELEGRAM_DEBUG] 비밀번호 찾기 알림 - IP: {ip}, 기기: {device_info}, 브라우저: {browser_info}")
# 사용자 존재 여부에 따른 메시지 구성
if user_exists:
status_icon = ""
status_text = "등록된 사용자"
action_text = "비밀번호 찾기 요청이 있습니다!"
else:
status_icon = ""
status_text = "미등록 사용자"
action_text = "등록되지 않은 전화번호로 비밀번호 찾기 시도!"
message = f"""
🔑 <b>신라AMP 비밀번호 찾기 알림</b>
📱 <b>전화번호:</b> {phone}
{status_icon} <b>상태:</b> {status_text}
<b>요청시간:</b> {current_time}
🌐 <b>접속 정보:</b>
@ -248,7 +260,7 @@ def send_password_reset_notification(phone, request):
기기: {device_info}
브라우저: {browser_info}
💡 비밀번호 찾기 요청이 있습니다!
💡 {action_text}
""".strip()
# 비동기로 전송 (사용자 대기시간 없음)

View File

@ -197,8 +197,37 @@ def password_change(request):
# 모드1: 비밀번호 찾기 (로그인하지 않은 상태)
def password_reset(request):
"""비밀번호 찾기 뷰"""
# 세션 초기화
if 'password_reset_step' not in request.session:
# GET 요청 시 세션 상태에 따른 처리
if request.method == 'GET':
# 강제 리셋 파라미터 확인
force_reset = request.GET.get('reset', '').lower() == 'true'
current_step = request.session.get('password_reset_step', 1)
current_verified = request.session.get('password_reset_verified', False)
# 강제 리셋이거나, 2단계 인증된 상태가 아닌 경우 세션 초기화
if force_reset or not (current_step == 2 and current_verified):
# 기존 비밀번호 찾기 세션 모두 제거
for key in ['password_reset_step', 'password_reset_code', 'password_reset_phone',
'password_reset_verified', 'password_reset_code_sent_at']:
request.session.pop(key, None)
# 새로운 세션 시작
request.session['password_reset_step'] = 1
request.session['password_reset_code'] = None
request.session['password_reset_phone'] = None
request.session['password_reset_verified'] = False
if force_reset:
print("[DEBUG] 비밀번호 찾기 세션 강제 초기화됨 (reset=true)")
else:
print("[DEBUG] 비밀번호 찾기 세션 초기화됨 (GET 요청)")
else:
print("[DEBUG] 비밀번호 찾기 2단계 인증된 상태 - 세션 유지")
# 세션 초기화 (POST 요청 시에도 세션이 없으면 초기화)
elif 'password_reset_step' not in request.session:
request.session['password_reset_step'] = 1
request.session['password_reset_code'] = None
request.session['password_reset_phone'] = None
@ -219,7 +248,25 @@ def password_reset(request):
form1 = PasswordResetStep1Form(request.POST)
if form1.is_valid():
phone = form1.cleaned_data['phone']
# 인증번호 생성 및 실제 SMS 발송
# 먼저 해당 전화번호로 가입된 사용자가 있는지 확인
try:
user = User.objects.get(username=phone)
print(f"[DEBUG] 비밀번호 찾기: 등록된 사용자 확인됨 - {phone}")
except User.DoesNotExist:
print(f"[DEBUG] 비밀번호 찾기: 등록되지 않은 전화번호 - {phone}")
# 미등록 사용자 시도에 대한 텔레그램 알림 전송
from A_core.telegram_utils import send_password_reset_notification
send_password_reset_notification(phone, request, user_exists=False)
error = '등록되지 않은 전화번호입니다. 회원가입을 먼저 진행해주세요.'
form1 = PasswordResetStep1Form(request.POST)
return render(request, 'C_accounts/password_reset.html', {
'step': 1, 'form1': form1, 'code_sent': False, 'error': error, 'message': None
})
# 등록된 사용자인 경우에만 인증번호 생성 및 SMS 발송
verification_code = str(random.randint(100000, 999999))
# 실제 SMS 발송
@ -234,9 +281,9 @@ def password_reset(request):
code_sent = True
print(f"[DEBUG] 비밀번호 찾기 SMS 발송 성공: {phone} - {verification_code}")
# 텔레그램 알림 전송 (비동기)
# 텔레그램 알림 전송 (비동기) - 등록된 사용자
from A_core.telegram_utils import send_password_reset_notification
send_password_reset_notification(phone, request)
send_password_reset_notification(phone, request, user_exists=True)
else:
error = '인증번호 발송에 실패했습니다. 잠시 후 다시 시도해주세요.'
print(f"[DEBUG] 비밀번호 찾기 SMS 발송 실패: {sms_result['error']}")

Binary file not shown.