한이음 프로젝트

[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