한이음 프로젝트
[DRF- User& sms인증] 아이디 찾기
정주정
2023. 9. 12. 23:26
전 게시글에서 sms 인증하는 것을 구현했는데 이번에는 인증을 기반으로 한 id찾기 기능을 구현하려고 한다.
1. view.py 구현
2. urls.py 구현
3. postman으로 실습
1.1 view.py 구현( 아이디 찾기 인증번호 보내기)
class UserIdLostView(APIView):
permission_classes = (AllowAny,)
def post(self,request):
data = json.loads(request.body)
try:
user = User.objects.get(username=data['name'], phone=data['phone'])
auth_num = random.randint(1000, 10000) # 인증번호 생성 (1000~9999)
# 인증번호를 auth_sms 테이블의 해당 번호의 auth 열에 저장
auth_sms = Auth.objects.get(phone=user.phone)
auth_sms.auth = auth_num
auth_sms.save()
sms_sender = SmsSendView() #인증번호 클래스
sms_sender.send_sms(phone =user.phone, auth = auth_num) #인증번호 전송 함수 호출
response_data = {"message":'인증번호를 전송했습니다.'}
return Response(response_data, status=status.HTTP_200_OK)
except User.DoesNotExist: #해당하는 유저가 없다면
response_data = {'auth': ["이름 혹은 폰번호를 다시 확인해주세요."]}
return Response(response_data, status=status.HTTP_404_NOT_FOUND)
-> 해당 코드는 요청으로 name(사용자 이름), phone(휴대폰 번호)를 준다. 그리고 Auth모델(테이블)에는 phone,username,auth,created_at,updated_at으로 이뤄져있으며,phone넘버와 auth_num을 값을 phone,auth의 열에 값을 삽입한다.
auth 모델은 아래와 같다.
class Auth(models.Model):
phone = models.CharField(max_length=11, primary_key=True)
username = models.TextField()
auth = models.IntegerField(blank=True)
created_at = models.DateTimeField(auto_now_add=True, blank=True)
updated_at = models.DateTimeField(auto_now = True, blank=True)
class Meta:
db_table = 'auth_sms'
1.2 view.py 구현 ( userId 찾기 인증 후 값변환 api)
class UserIdRecoveryView(APIView):
def post(self, request):
data = request.data
try:
user = User.objects.get(username=data['name'], phone=data['phone'])
auth = data['auth']
auth_record = Auth.objects.get(phone=user.phone) #해당 번호로 auth테이블에서 가져온다.
if auth_record.auth == auth:
response_data = {'message': "인증이 완료되었습니다.","userIdx" : user.userIdx, "users_id": user.users_id}
return Response(response_data, status=status.HTTP_200_OK)
else:
response_data = {'auth':['인증번호가 일치하지 않습니다.']}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
except User.DoesNotExist:
response_data = {'auth':['해당 유저의 정보를 찾을 수 없습니다.']}
return Response(response_data, status=status.HTTP_404_NOT_FOUND)
except Auth.DoesNotExist: #해당 휴대폰 번호에 대한 인증 정보가 없습니다
response_data = {'auth':['휴대폰 번호를 다시 확인하세요.']}
return Response(response_data, status=status.HTTP_404_NOT_FOUND)
-> name,과 phone과 auth(인증번호)를 post형식으로 요청값으로 보내고,
- if auth_record.auth == auth : 는 가져온 행의 auth 값이 내가 작성한 auth와 같은지 판단. 없다면, 인증번호 불필치
2. urls.py 구현
path('users/uid-lost',views.UserIdLostView.as_view()),
path('users/uid-recovery',views.UserIdRecoveryView.as_view()),
- users/uid-lost : 아이디 찾기 인증번호 보내기
- users/uid-recovery : userId 찾기 인증 후 값변환 api
3. postman 실습
3.1 - users/uid-lost : 아이디 찾기 인증번호 보내기

이렇게 보내면, 해당 번호로 인증번호가 전송이 됩니다.
3.2 - users/uid-recovery : userId 찾기 인증 후 값변환 api
