우선 SMS 인증을 위해 Naver Cloud Platform에 가입을 해야한다.
물론 Naver 말고도 SMS 인증을 도와주는 다른 플랫폼도 많다.
하지만 해당 플랫폼을 선택한 이유는 10만 크레딧을 무료로 제공해주기 때문이다.
회원가입을 완료했으면 Simple & Easy Notification Service를 이용신청하면 된다.
이후에 프로젝트를 생성해준다.
각 서비스 타입 및 이름은 각자 작성해준다.
생성 후 발신번호를 꼭 등록해주어야 하는데, 본인 소유의 발신번호일 경우 간단하게 신청이 된다.
여기까지 기본 설정이 끝났으면 인증키를 발급받아야한다.
OPEN API Key
project 생성시 발급 가능하다. (
Access Key / Secret Key
마이페이지 - 인증키 관리에서 발급 받을 수 있다.
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)위에서 만든 메소드를 사용하여 저장한다.
이후 데이터를 전송하면 아래와 같이 인증 코드가 온 것을 확인해 볼 수 있다.