드레:
코딩 뿌시기
드레:
전체 방문자
오늘
어제
  • 분류 전체보기 (268)
    • Python (74)
      • Python 기초 (42)
      • Numpy (8)
      • Pandas (22)
    • Machine Learning (31)
      • Machine Learning (1)
      • Deep Learning (27)
    • AWS (22)
      • RDS (3)
      • EC2 (9)
      • Lambda (8)
      • S3 (2)
    • MySQL (24)
    • Git (8)
    • Streamlit (12)
    • REST API (22)
    • Java (24)
    • Android (36)
    • Debugging (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Callback
  • pandas
  • AWS
  • Streamlit
  • AWS Lambda
  • flask
  • fine tuning
  • Java
  • Ann
  • Retrofit2
  • rest api
  • 서버리스
  • GET
  • 깃이그노어
  • aws s3
  • 안드로이드 스튜디오
  • JWT
  • Transfer Learning
  • serverless
  • 네이버 API
  • CNN
  • volley
  • tensorflow
  • 액션바
  • 딥러닝
  • EC2
  • github
  • Lambda
  • API
  • Python

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
드레:

코딩 뿌시기

API서버 - Flask JWT를 사용한 로그인 API 만들기
REST API

API서버 - Flask JWT를 사용한 로그인 API 만들기

2023. 1. 5. 20:20

0. user 테이블 구조

 

 

1. MySQL에 접속하는 함수

# mysql_connection.py 파일
import mysql.connector

from config import Config 

def get_connection():

    connection = mysql.connector.connect(
        host= Config.HOST,
        database= Config.DATABASE,
        user= Config.DB_USER,
        password= Config.DB_PASSWORD
    )
    return connection

 

 

2. 비밀번호가 맞는지 체크하는 함수

회원가입 할 때 비밀번호를 단방향 암호화 했기 때문에 복호화 할 수 없으므로,

확인하는 함수도 단방향 암호화해서 같은지 확인한다.

# utils.py 파일
from passlib.hash import pbkdf2_sha256

from config import Config

# 원문 비밀번호를, 단방향 암호화하는 함수
def hash_password(original_password):
    
    password = original_password + Config.SALT
    password = pbkdf2_sha256.hash(password)
    return password
    
# 유저가 로그인 할때, 입력한 비밀번호가 맞는지 체크하는 함수
def check_password(original_password, hashed_password):
    
    password = original_password + Config.SALT

    check = pbkdf2_sha256.verify(password, hashed_password)
    return check

 

 

3. 민감한 변수 관리

노출이 되면 안되는 변수들은 보안을 위해 따로 파일을 만들어 관리한다.

 

# config.py 파일
class Config :
    HOST = 주소
    DATABASE = DB명
    DB_USER = 유저명
    DB_PASSWORD = 비밀번호
    SALT = 솔트

    # JWT 관련 변수 셋팅
    JWT_SECRET_KEY = 암호화키
    JWT_ACCESS_TOKEN_EXPIRES = False  # 토큰만료설정
    PROPAGATE_EXCEPTIONS = True  # 명시적으로 예외를 전파

 

 

4. 로그인 API

flask_jwt_extended 라이브러리를 사용해 access token을 리턴하게 만든다.

from flask import request
from flask_restful import Resource
from mysql.connector import Error
from email_validator import validate_email, EmailNotValidError
from flask_jwt_extended import create_access_token, jwt_required, get_jwt

from mysql_connection import get_connection
from utils import check_password, hash_password

class UserLoginResource(Resource):
    def post(self):
    	# 클라이언트로부터 받는 json 형태
        # {
        # "email": "tnwhd99@gmail.com",
        # "password": "akwmvow"
        # }

        # 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:
            if not result_list:
                return {'error' : '회원가입한 사람이 아닙니다.'}, 400
			
            # DB의 timestamp컬럼이 자동으로 datetime으로 변환되어 
            # json으로 보낼 수 없으므로 문자열로 변환해준다.
            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 += 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

 

 

5. 메인파일 

# app.py 파일

from flask import Flask
from flask_restful import Api
from config import Config
from flask_jwt_extended import JWTManager

from resources.user import UserRegisterResource, UserLoginResource



app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)

# JWT 매니저 초기화(initialize)
# JWTManager(app)을 설정해줘야 flask istance에서 jwt를 사용할 수 있게 된다.
jwt = JWTManager(app)


api = Api(app)

# 경로와 리소스를 연결한다.
api.add_resource(UserRegisterResource, '/user/register')
api.add_resource(UserLoginResource, '/user/login')


if __name__ == '__main__':
    app.run()

 

 

6. MySQL 회원정보

select * from user

 

 

7. 포스트맨으로 테스트

user id 12번 이승기가 로그인 했을 때

user id 12라는 정보를 token으로 만들어 리턴해준다.

'REST API' 카테고리의 다른 글

API서버 - Flask JWT를 사용한 로그아웃 API 만들기  (0) 2023.01.05
API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기  (0) 2023.01.05
API서버 - Flask JWT를 사용한 회원가입 API 만들기  (2) 2023.01.05
API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드)  (0) 2023.01.04
API서버 - Python MySQL Connector를 이용해 update하기(PUT 메소드)  (0) 2023.01.04
    'REST API' 카테고리의 다른 글
    • API서버 - Flask JWT를 사용한 로그아웃 API 만들기
    • API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기
    • API서버 - Flask JWT를 사용한 회원가입 API 만들기
    • API서버 - Python MySQL Connector를 이용해 delete하기(DELETE 메소드)
    드레:
    드레:

    티스토리툴바