파이썬 실습/구글OTP 로그인 인증을 클라이언트&서버에 적용해 보기

파이썬 구글OTP 클라이언트/서버에 적용하기 - 3.로그인 페이지 접속 후 2팩터 인증하기

파기차차 2023. 1. 19. 07:02
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 

 - 이번 글은 이전글(파이썬 구글OTP 클라이언트/서버에 적용하기 - 2.QR코드생성 및 서버에 구글OTP알고리즘 적용)에 이은 3번째 마지막 글로 이용자가 로그인 페이지에 접속 후 실제 자신의 구글OTP앱의 값으로 OTP인증을 하는 과정에 대하여 설명합니다.

 

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

1. 프로그램을 실행하면 아래와 같은 모습으로 실행됩니다.

 

 -이용자가 순서대로 ID, PW를 입력하고, 자신의 구글OTP앱에서 생성된 OTP 값을 추가로 입력합니다.

아래에서는 첫번째 구글OTP의값을 '111111'로 잘못 입력하여 로그인 실패 후 다시 정확한 값('720962')을 입력하여 로그인에 성공한것을 볼 수 있습니다.

 

 

 

 

 

O 시작전 준비 사항

 

 

 

1. 프로그램을 실행하기 위해서는 아래 모듈들이 필요합니다. 아래와 같이 임포트(설치) 해줍니다.

 

import onetimepass as otp # pip install onetimepass (파이썬용 구글 otp 모듈 적용)
import qrcode # pip install qrcode

 

※ 설치 시 에러가 발생거나, 궁금하신 점이 있으시면 댓글로 문의 주시면 친절하게 답변드리겠습니다.

 

 

 


 

 

 

 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 파일 : 3.py

import onetimepass as otp # pip install onetimepass
import qrcode

################################################################
# 1. QR코드 생성후 이용자에게 secretKey 전송
################################################################
img = qrcode.make("ABCDEFGHIJKLMNOPQRSTUVWXYZ======")
img.save("secretKey.img")
print(type(img))
print(img.size)
################################################################


################################################################
# 2. 이용자는 구글OTP앱을 설치 후 1.에서 전송받은 QR코드 이미지로부터 
# 얻은 secretKey를 구글OTP에 등록
################################################################



################################################################
# 3. 서버 구축 후 인증부분에 구글OTP알고리즘 적용(임시 비밀번호 생성)
################################################################
secretKey = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ======'

def get_code():
    print(secretKey,"+++++++++++++++++++++++ 999")
    rt = otp.get_totp(secretKey)
    print(rt, type(rt))
    return rt

code = get_code()
print("서버쪽 임시 비밀번호(OTP생성값)1: ", code)


result = otp.valid_totp(code, secretKey) # 결과에 대한 유효성 검증
# = True

print(result)




################################################################
# 4. 로그인 페이지에서 이용자가 로그인 시도 
################################################################
cnt = 0

while True:
    code = get_code()
    print("서버쪽 임시 비밀번호(OTP생성값)2: ", code)

    id = input('ID 입력:')
    pw = input('PW 입력:')
    myotp = input('OTP값 입력:')
    print(myotp, type(myotp), "++++++++++++++++++", code, type(code))


    ################################################################
    # 5. 이용자가 입력한 구글OTP의 임시비밀번호 6자리와 서버쪽에서 생성한
    # 임시 비밀번호 6자리가 동일한지 비교
    ################################################################
    if id=='admin' and pw=='1234' and myotp == str(code):
        print('로그인 성공')
        break
    else:
        cnt = cnt + 1
        print('로그인 {}회 실패'.format(cnt))

    if cnt >=3:
        print("3회이상 로그인을 실패하여 종료합니다.")
        break

    # 엔터
    print()

 

 

 

 

 

O 소스 실행 방법

 
 
 
 - 소스파일을 3.py로 저장 후 cmd, 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
 
 
 > python 3.py
 

 

 


 
 

O 주요 내용

 

 

1.프로그램을 실행하면 아래와 같이 id와 pw 그리고 otp를 물어보며, 이 모두가 서버에서 가지고 있는 값과 일치해야 로그인을 정상적으로 할 수 있게 됩니다.

 

 

아래에서는 일부러 id/pw는 옳게 입력하고, otp값을 틀리게 입력하였더니, '로그인 1회 실패'라고 메시지가 떴습니다.

 

그리고 다시 id, pw, otp값을 정확히 입력하였더니 '로그인 성공' 메시지가 나왔습니다.

(참고로 otp의 값(임시 비밀번호 6자리)은 테스트를 위해 화면에 출력('서버쪽 임시 비밀번호(OTP생성값)2: 720962')하였습니다.)

 

 

 

 

 2.소스를 살펴보면 while 루프로 id, pw, otp가 틀리더라도 3번까지는 입력 받을 수 있도록 하였습니다.

그리고, id, pw, myotp 값을 입력 받은 후

이용자가 입력한 otp값(myotp)과 서버쪽에서 생성한 otp값(code)이 같은지 비교하고, 같으면 '로그인 성공' 메시지를 같지 않으면 '로그인 {}회 실패' 메시지를 보여주도록 하였습니다.

 

또한 3회이상 틀리는 경우에는 'break'로 루프를 빠져나와 프로그램을 종료하도록 하였습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 구글OTP알고리즘이 적용된 서버에 이용자가 로그인 페이지 접속 후 실제 자신의 구글OTP앱의 값으로 OTP인증을 하는 과정에 대하여 알아보았습니다.
 
 
 
 
 
 - 오늘 우리가 배운 내용을 정리해 보면 아래와 같습니다.
 
 

1.서버쪽 로그인 페이지를 만들기 위해 while 루프와 if문을 이용하여 최대한 간단히 작성

2.이용자가 입력한 otp값과 서버에서 생성한 otp 값이 같은지 확인

>if id=='admin' and pw=='1234' and myotp == str(code):

 

 

 

이것으로 파이썬으로 구글OTP 클라이언트/서버에 적용하기 편을 마칩니다.

오늘은 여기까지이며, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.

 

 

감사합니다.

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

728x90
반응형
LIST