2025년 April 16일
  1. 개발 히스토리
  2. [Backend] 전화번호 인증

[Backend] 전화번호 인증

전화번호 인증

Python 코드 구현

인증번호 생성

import random

def generate_verification_code():
    return ''.join([str(random.randint(0, 9)) for _ in range(6)])

랜덤으로 6자리의 인증번호를 생성하기 위한 코드입니다.

SMS 문자 전송

from sdk.api.message import Message
from sdk.exceptions import CoolsmsException
from core.config import COOL_SMS_API, COOL_SMS_SECRET
from core.config import ADMIN_PHONE_NUMBER

def send_message(phone_number : str, code : str):
    api_key = COOL_SMS_API
    api_secret = COOL_SMS_SECRET

    params = dict()
    params['type'] = 'sms' # Message type ( sms, lms, mms, ata )
    params['to'] = phone_number # 받을 사람 번호
    params['from'] = ADMIN_PHONE_NUMBER # 보내는 사람 번호
    params['text'] = f'[META LLM MSP] 인증번호 {code}' # 문자 내용

    cool = Message(api_key, api_secret)
    try:
        cool.send(params)

    except CoolsmsException as e:
        print("Error Code : %s" % e.code)
        print("Error Message : %s" % e.msg)
        return "fail"

COOL SMS 서비스를 활용하여 생성된 코드를 사용자에게 문자로 전송합니다.

스키마 구현

from pydantic import BaseModel

class FindEmailRequest(BaseModel):
    phone_number : str

class FindEmailResponse(BaseModel):
    code : str
    email : str

클라이언트로부터 사용자가 입력한 전화번호를 요청으로 받고,
모든 로직이 끝난 후 입력된 코드와 이메일을 응답으로 전송합니다.

CRUD 함수

def sms_verfication(db: Session, phone_number : str):
    user = db.query(User).filter(User.phone_number == phone_number).first()
    if user :
        code = generate_verification_code()
        send_message(phone_number=phone_number, code=code)
        return code, user.email
    else :
        return "가입되지 않은 전화번호입니다."

사용자가 찾으려는 번호가 실제 DB에 있는 전화번호인지 확인하는 로직부터 수행합니다.
이후 전화번호가 있다는 것을 확인하고 해당 사용자에게 SMS 인증번호를 전송합니다.
그리고 email 주소도 함께 반환합니다.

엔드포인트

@user_router.post("/FindEmail", response_model=FindEmailResponse)
async def find_email_endpoint(request: FindEmailRequest, db: Session = Depends(get_db)):
    phone_number = request.phone_number
    result = sms_verfication(db = db, phone_number = phone_number)
    return JSONResponse(content={'code': f'{result[0]}', 'email' : f'{result[1]}'}, status_code=200)

FineEmail이라는 요청이 들어올 경우 앞서 정의한 기능들을 차례대로 수행합니다.
이후 Repsonse로 인증번호와 이메일 주소를 반환합니다.

테스트

우선 백엔드에서만 구현한 기능이라 테스트를 위해 Redoc를 활용했습니다.

코드 생성

정상적으로 6자리의 코드를 반환합니다.
이메일도 함께 전달됩니다.

문자 전송

인증번호가 정상적으로 전송되는 것을 확인할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

연관 글
BCT NEWS
인기 글
워드프레스 보안
워드프레스 모음
워드프레스 유지보수
워드프레스 제작 팁