클라우드 공부 일지

FastAPI SMS 전송 및 인증 확인 with coolsms 본문

Python

FastAPI SMS 전송 및 인증 확인 with coolsms

SYUKJH 2024. 8. 3. 20:53

requirements.py 

annotated-types==0.7.0
anyio==4.4.0
certifi==2024.7.4
charset-normalizer==3.3.2
click==8.1.7
coolsms==0.4
coolsms_python_sdk==2.0.3
fastapi==0.112.0
h11==0.14.0
idna==3.7
pydantic==2.8.2
pydantic_core==2.20.1
python-dotenv==1.0.1
requests==2.32.3
sniffio==1.3.1
starlette==0.37.2
typing_extensions==4.12.2
urllib3==2.2.2
uvicorn==0.30.5

 

작성한 후 아래 명령어를 터미널에 입력하면 필요한 패키지들을 자동으로 설치해 준다.

pip install -r requirements.txt

 

main.py 

import random
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sdk.api.message import Message
from sdk.exceptions import CoolsmsException
from dotenv import load_dotenv
import os

# .env 파일의 환경 변수를 로드합니다.
load_dotenv()

# 환경 변수에서 API 키와 비밀번호를 불러옵니다.
API_KEY = os.getenv("API_KEY")
API_SECRET = os.getenv("API_SECRET")
SENDER_NUMBER = os.getenv("SENDER_NUMBER")

app = FastAPI()

verification_codes = {}


class PhoneNumberRequest(BaseModel):
    phone_number: str


class VerifyCodeRequest(BaseModel):
    phone_number: str
    verification_code: str


def generate_verification_code(length=6):
    return "".join(random.choices("0123456789", k=length))


@app.post("/send_sms/")
def send_sms(request: PhoneNumberRequest):
    verification_code = generate_verification_code()
    verification_codes[request.phone_number] = verification_code

    params = {
        "type": "sms",
        "to": request.phone_number,
        "from": SENDER_NUMBER,
        "text": f"인증번호는 {verification_code}입니다.",
    }
    cool = Message(API_KEY, API_SECRET)
    try:
        response = cool.send(params)
        if response["success_count"] > 0:
            return {"message": "SMS sent successfully"}
        else:
            raise HTTPException(status_code=400, detail="Failed to send SMS")

    except CoolsmsException as e:
        raise HTTPException(status_code=500, detail=f"Internal Server Error: {e.msg}")


@app.post("/verify_sms/")
def verify_sms(request: VerifyCodeRequest):
    if verification_codes.get(request.phone_number) == request.verification_code:
        return {"message": "Verification successful"}
    else:
        raise HTTPException(status_code=400, detail="Invalid verification code")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

 

.env

API_KEY = "coolsms에서 받은 api 키"
API_SECRET = "coolsms에서 받은 api 시크릿 키"
SENDER_NUMBER = "핸드폰 번호"

 

프로젝트 디렉토리 구조

project_directory/
│
├── main.py
├── .env
└── requirements.txt

 

 

 

SMS 전송 Curl문 예시

# SMS 전송 요청
curl -X 'POST' \
  'http://127.0.0.1:8000/send_code/' \
  -H 'Content-Type: application/json' \
  -d '{
  "phone_number": "01012345678"
}'

 

인증 코드 검증 Curl문 예시

# 인증 코드 검증 요청
curl -X 'POST' \
  'http://127.0.0.1:8000/verify_code/' \
  -H 'Content-Type: application/json' \
  -d '{
  "phone_number": "01012345678",
  "verification_code": "123456"
}'

 

 

실행 시 결과 값

SMS 전송을 성공했을 때
인증 코드를 다르게 입력했을 때
입력 코드를 올바르게 입력했을 때