본문 바로가기

TIL

flask JWT test

728x90

flask JWT test


본격 프로젝트를 들어가기 앞서 서면 피드백을 받았다.
우리조에서 수정기능 해본 사람이 나밖에 없어서 그냥 쿼리스프링으로
특정 데이터 가져와 수정하는 걸 해본 내가 쿼리스프링 수정 uri로 이야기해 그렇게 작성해서 제출했었다.
서면피드백받고 다시 프로젝트 발제보니 RESTful API를 사용하라고 권장..

더 공부해야 할 내용

  • JWT
  • RESTful API URI


나는 오늘 flask-mysql 연동했던 users 테이블로 토큰 생성해서 출력해보는 거랑
특정 토큰 값을 활용해 접근하는 것 까지 해봤다.
하지만 jwt의 header, payload, verify signature은 생소하고 구현해봤지만, 이걸 어떻게 활용해야 할지 감이 안잡힌다.


📄 MySQL

USE flask_test;

CREATE TABLE users(
    id int NOT NULL AUTO_INCREMENT,
    email varchar(200),
    password varchar(200),
    PRIMARY key(id)
);

INSERT
    INTO
    users
VALUES(
    'xxxxhh@naver.com',
    '87654321'
),
(
    'dbyeon@naver.com',
    '12345678'
),
(
    '1234',
    'qwer'
),;
users table data

나의 users 테이블에 회원등록했다는 가정하에 id(email), pw insert

📄 app.py

# flask, flask-jwt-extended, pymysql 라이브러리 설치
from flask import Flask, render_template, request, jsonify
import pymysql
import json
from flask_jwt_extended import *

application = Flask(import_name = __name__)

# 토큰 생성에 사용될 Secret Key를 flask 환경 변수에 등록
application.config.update(
			DEBUG = True,
			JWT_SECRET_KEY = "I'M IML"
		)

# JWT 확장 모듈을 flask 어플리케이션에 등록
jwt = JWTManager(application)

@application.route("/")
def test_test():
	return "<h1>Hello, I'm IML!</h1>"


필요한 라이브러리 설치


로그인

📄 app.py

@application.route("/login", methods=['POST'])
def login_proc():
	# 클라이언트로부터 요청된 값
	input_data = request.get_json()
	print(input_data)
	user_id = input_data['id']
	user_pw = input_data['pw']

	print('get_users from mysql')

	db = pymysql.connect(host='localhost', user='root', db='flask_test', password='12345678', charset='utf8')
	curs = db.cursor()

	sql = """
	SELECT * 
	FROM users u
	where u.email = %s
	"""

	curs.execute(sql, user_id)

	rows = curs.fetchall()
	print(rows)

	json_str = json.dumps(rows, indent=4, sort_keys=True, default=str)
	db.commit()
	db.close()

	# 아이디, 비밀번호가 일치하는 경우
	if (user_id == rows[0][0] and
			user_pw == rows[0][1]):
		access_token = create_access_token(identity=user_id,
										   expires_delta=False)
		print(access_token)

		return jsonify(
			result="success",
			# 검증된 경우, access 토큰 반환
			access_token=create_access_token(identity=user_id,
											 expires_delta=False)
		)

	# 아이디, 비밀번호가 일치하지 않는 경우
	else:
		return jsonify(
			result="Invalid Params!"
		)

입력받은 id값이 있다면 mysql에서 값을 가져올 것이고 그렇지 않다면 가져오지 못할 예정!

📌 postman post test

아이디 비번 성공시, 토큰 생성
아이디 비번 db 불일치시, fail

토큰 유효성 검사

📄 app.py

@application.route('/user_only', methods=["GET"])
@jwt_required()
def user_only():
	print("get jwt")
	cur_user = get_jwt_identity()
	print(cur_user) #아이디 값
	if cur_user is None:
		return "User Only!"
	else:
		return "Hi!," + cur_user

if __name__ == '__main__':
	application.run(host = '0.0.0.0',
					port = 5000,
					debug = True)

📌 postman get test

header value값에 토큰값을 넣을때 Bearer 붙여줘야 한다.

아이디 1234의 토큰임을 알 수 있음!

📌 jwt.io

아이디 1234의 jwt.io다.

jwt.io

jwt는 header, payload, signature로 이뤄졌다.

  • header : 토큰 타입과 사용되는 해시 알고리즘 지정
  • payload : jwt를 통해 실제 서버 간에 전송하고자 하는 데이터
  • signature : jwt가 원본 그대로라는 것을 확인할 때 사용하는 부분


이제 token값을 접근해 decode해서 아이디 정보로 접근해 작업하는 프로젝트를 찾아 작업하면 될듯하다!


참고한 블로그 : [Flask 입문] JWT 토큰을 이용해서 로그인/인증 기능을 만들어 보자 : 네이버 블로그 (naver.com)

[Flask 입문] JWT 토큰을 이용해서 로그인/인증 기능을 만들어 보자

이번 포스팅에서는 Flask에서 사용자 인증을 비롯하여 간단한 로그인 API를 만들어 보자. 해당 포스팅...

blog.naver.com