본문 바로가기
Restful API

[Restful API] Flask에서 JWT 사용하기 (로그인/로그아웃 API 만들기)

by coding_su 2023. 1. 5.

📝Flask에서 JWT 사용하기 (로그인/로그아웃 API 만들기)

새로운 파일인 유저 파일에 회원가입한 회원일때 비밀번호가 일치하면 로그인을 시켜주게 코드를 작성한다

※ app.py에 경로 설정 (api.add_resource(UserLoginResource, '/user/login')

class UserLoginResource(Resource) :

    def post(self) :
        # {"email": "abc@naver.com",
        # "password": "1234"}

        # 1. 데이터 받아오기
        data = request.get_json()

        # 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()

            # 가져온 결과가 없을때 처리 (=회원가입 하지 않은 사람)
            if len(result_list) == 0 :
                return {"error" : "회원가입한 사람이 아닙니다"} , 400

            # 시간을 문자열로 변환
            i = 0
            for row in result_list :
                result_list[i]['created_at'] = row['created_at'].isoformat()
                result_list[i]['updated_at'] = row['updated_at'].isoformat()
                i = i + 1

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"error" : str(e)}, 500

        print(result_list)

        # 3. 비밀번호가 맞는지 확인한다
        check = check_password( data['password'], result_list[0]['password'] )

        if check == False :
            return {"error" : "비밀번호가 일치하지 않습니다"} , 400

        # 4. JWT 토큰을 만들어서 클라이언트에게 보낸다
        access_token = create_access_token( result_list[0]['id'] )

        return {"result" : "success", "access_token" : access_token}, 200

 

로그아웃코드를 작성할때는 로그아웃 된 토큰을 저장할 셋(set)을 만들고(유저파일에 만든다)

app.py에 로그아웃된 토큰으로 요청하는 경우 처리하는 코드작성한다

# 로그아웃된 토큰으로 요청하는 경우 처리하는 코드작성
@jwt.token_in_blocklist_loader
def check_if_token_is_revoked(jwt_header, jwt_payload) : 
    jti = jwt_payload['jti']
    return jti in jwt_blacklist

 

유저파일에 로그아웃 코드 작성

# 로그아웃된 토큰을 저장할 셋(set)을 만든다
jwt_blacklist = set()

class UserLogoutResource(Resource) :

    @jwt_required()
    def post(self) :
        
        jti = get_jwt()['jti']
        print(jti)

        jwt_blacklist.add(jti)

        return {'result' : 'success'}, 200

 

포스트맨에 테스트해본다

Headers에 Key는 Authorization, VALUE는 Bearer 토큰값을 입력

댓글