RestFul API

[RestFul API] 회원가입 / 로그인 API에서, 토큰 생성해서 처리하는 방법

Mei99 2024. 5. 22. 12:37

클라이언트와 서버간의 인증토큰 흐름

- 회원가입 / 로그인 시 토큰 발행

- 클라이언트한테 받은 회원정보가 DB에 저장되고, DB에서 정보를 다시 보낼 때, 유저 아이디가 생성된다. 보안상 이 유저아이디를 JWT로 암호화 해야 한다.

- 발행된 토큰을 클라이언트에서 저장하고, 이것을 인증이 필요한 API 호출에 사용한다.

- 회원가입 시 생긴 토큰 : 회원가입 후 로그아웃하기 전까지 사용, 로그아웃하면 토큰이 만료된다.

- 로그인 시 생긴 토큰 : 재 로그인 시 사용

 

 

회원가입 / 로그인 API에서, 토큰 생성해서 처리하는 방법

- create_access_token( )

: 토큰 생성 함수

 

토큰 생성 라이브러리 불러오기

from flask_jwt_extended import create_access_token

 

 

 

회원가입 /로그인 API에 토큰 생성하기

1. 코드가 저장된 user.py에서, 토큰 생성 함수 넣어주기

- user_id 암호화를 위해 환경 변수 세팅

     access_token = create_access_token(user_id)

 

2.  인증토큰 access_token 리턴에 추가

        # 7. 응답할 데이터를 JSON으로 만들어서 리턴.
        return {'result' : 'sueccess', 'access_token' : access_token}

 

회원가입 전체 코드

class UserRegisterResource(Resource) :
    def post(self) :
        # 1. 클라이언트가 보낸 데이터를 받아준다.
        data = request.get_json()
        print(data)

        # 2. 데이터가 모두 있는지 확인
        if data.get('email') is None or data.get('email').strip() == '' or \
            data.get('username') is None or data.get('username').strip() == '' or \
            data.get('password') is None or data.get('password').strip() == '' :
            return {"result" : "fail"}, 400


        # 3. 이메일주소 형식이 올바른지 확인한다.
        try :
            validate_email(data['email'])
        except EmailNotValidError as e :
            return {"result" : "fail", 'error' : str(e)}, 400


        # 4. 비밀번호 길이가 유효한지 체크한다.
        #    예) 비번은 4자리 이상 12자리 이하!
        if len(data['password']) < 4 or len(data['password']) > 12 :
            return {"result" : "fail", 'error' : str(e)}, 400
       
        # 5. 비밀번호를 암호화한다.
        password = hash_password(data['password'])
        print(password)

        # 6. DB에 저장한다.
        try :
            connection = get_connection()
            query = ''' insert into user
                        (username, email, password)
                        values
                        (%s, %s, %s);'''
            # password : 위에서 만든 암호화된 비번
            record = (data['username'], data['email'], password)
            cursor = connection.cursor()
            cursor.execute(query, record)
            connection.commit()
           
            ### DB에 회원가입하여, user 테이블에 insert된 후,
            ### 이 user 테이블의 id값을 가져와야 한다.
            user_id = cursor.lastrowid
           
            cursor.close()
            connection.close()

        except Error as e :
            if cursor is not None :
                cursor.close()
            if connection is not None :
                connection.close()
            return{'result' : 'fail', 'error' : str(e)}, 500
       
        # 6-2 user_id를 바로 클라이언트에게 보내면 안되고,
        ##    JWT로 암호화 해서, 인증토큰을 보내야 한다.
        access_token = create_access_token(user_id)       


        # 7. 응답할 데이터를 JSON으로 만들어서 리턴.
        return {'result' : 'sueccess', 'access_token' : access_token}

 

 

로그인 전체 코드

class UserLoginResource(Resource) :
    def post(self) :
       
        # 1. 클라이언트로부터 데이터를 받는다.
        data = request.get_json()

        if 'email' not in data or 'password' not in data:
            return {'result' : 'fail'}, 400
        if data['email'].strip() == '' or data['password'].strip() == '':  
            return {'result' : 'fail'}, 400
        # 2. DB로부터 이메일에 해당하는 유저 정보를 가져온다.
        try :
            connection = get_connection()
            query = '''select *
                        from user
                        where email = %s ;'''
            record = ( data['email'] ,  )
            cursor = connection.cursor(dictionary=True)
            cursor.execute(query, record)

            result_list = cursor.fetchall()

            print(result_list)

            cursor.close()
            connection.close()

        except Error as e:
            if cursor is not None:
                cursor.close()
            if connection is not None:
                connection.close()
            return {'result':'fail', 'error':str(e)},500

        # 3. 회원인지 확인한다.
        if result_list == [] :
            return {'result' : 'fail'} , 401

        # 4. 비밀번호를 체크한다.
        # 유저가 입력한 비번 data['password']
        # DB에 암호화된 비번 result_list[0]['password']
        isCorrect = check_password(data['password'] , result_list[0]['password'])
        if isCorrect == False :
            return {'result' : 'fail'} , 401

        # 5. 유저아이디를 가져온다.
        user_id = result_list[0]['id']

        # 6. JWT 토큰을 만든다.
        access_token = create_access_token(user_id)
       

        # 7. 클라이언트에 응답한다.
        return {'result' : 'success', 'access_token':access_token}

 

 

 

실행

: Postman에서 인증토큰 설정되어 호출된 것을 확인할 수 있다.