[Django]SMS인증 - Naver Cloud

Hyeo_Ni__·2024년 1월 29일
0

Django

목록 보기
10/12
post-thumbnail

📚 Naver Cloud Platform

우선 SMS 인증을 위해 Naver Cloud Platform에 가입을 해야한다.

물론 Naver 말고도 SMS 인증을 도와주는 다른 플랫폼도 많다.
하지만 해당 플랫폼을 선택한 이유는 10만 크레딧을 무료로 제공해주기 때문이다.

회원가입을 완료했으면 Simple & Easy Notification Service를 이용신청하면 된다.

이후에 프로젝트를 생성해준다.

각 서비스 타입 및 이름은 각자 작성해준다.

생성 후 발신번호를 꼭 등록해주어야 하는데, 본인 소유의 발신번호일 경우 간단하게 신청이 된다.

여기까지 기본 설정이 끝났으면 인증키를 발급받아야한다.


📚 API 인증키 및 기타 인증키

  • OPEN API Key


    project 생성시 발급 가능하다. (

  • Access Key / Secret Key



    마이페이지 - 인증키 관리에서 발급 받을 수 있다.


📚 SMS 인증

✍ 코드

create table sms(
	id int auto_increment primary key,
    phone_number varchar(15),
    auth_number varchar(6)
);
# models.py

class Sms(models.Model):
    phone_number = models.CharField(max_length=15, blank=True, null=True)
    auth_number = models.CharField(max_length=6, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sms'

    @classmethod
    def create_sms(cls, phone_number, auth_number):
        sms = cls(phone_number=phone_number, auth_number=auth_number)
        sms.save()

우선 위와 같이 테이블을 만들어준다.
테이블 생성 및 수정, 삭제시 반드시 해줘야하는 'python manage.py migrate'를 해준다.

저장 메서드를 추가하여 SMS를 저장할 때 사용한다.

✍ 코드

pip install requests

필요한 라이브러리인 requests를 설치해준다.

✍ 코드

# sms.py

import json
import requests
import time
import base64
import hashlib
import hmac

def make_signature(url, access_key, secret_key):
    timestamp = str(int(time.time() * 1000))
    method = "POST"
    message = method + " " + url + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    secret_key = bytes(secret_key, 'UTF-8')
    signingkey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
    return signingkey

def send_sms(phone_number, content):
    user_access_key = "access key 입력"
    user_secret_key = "secret key 입력"
    sms_service_id = "OPEN API Key(서비스 ID)"
    url = "/sms/v2/services/" + sms_service_id + "/messages"
    api_url = 'https://sens.apigw.ntruss.com' + url

    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'x-ncp-apigw-timestamp': str(int(time.time() * 1000)),
        'x-ncp-iam-access-key': user_access_key,
        'x-ncp-apigw-signature-v2': make_signature(url, user_access_key, user_secret_key)
    }

    body = {
        "type": "SMS",
        "contentType": "COMM",
        "countryCode": "82",
        "from": "등록한 연락처",
        "content": content,
        "messages": [
            {
                "to": phone_number,
            }
        ]
    }

    body_result = json.dumps(body)

    response = requests.post(api_url, headers=headers, data=body_result)
    response.raise_for_status()
    response_result = response.json()

    send_result = response_result.get('statusCode')

    if send_result == "202":
        return True
    else:
        return False
  • 기본정보

  • 메시지 발송


위 표를 참고하여 sms.py코드를 작성하였다.
자세한건 SMS API사이트에서 확인할 수 있다.

✍ 코드

# views.py
import random
from .sms import send_sms

@api_view(['POST'])
def SMS(request):
    if request.method == 'POST':
        phone_number = request.data.get('phone_number')
        auth_number = str(random.randint(100000, 999999))
        sms_content = f"[TEST]\n인증 코드는 {auth_number} 입니다."
        send_result = send_sms(phone_number, sms_content)

        if send_result:
            # SMS를 데이터베이스에 저장
            Sms.create_sms(phone_number, auth_number)
            return Response({'message': '인증 문자 전송이 완료되었습니다.'}, status=status.HTTP_201_CREATED)
        else:
            return Response({'message': '인증 문자 전송에 실패했습니다.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

Sms.create_sms(phone_number, auth_number)위에서 만든 메소드를 사용하여 저장한다.

이후 데이터를 전송하면 아래와 같이 인증 코드가 온 것을 확인해 볼 수 있다.

profile
개발자로 성장 중 입니다.

0개의 댓글