클라이언트와 서버간의 인증토큰 흐름
- 회원가입 / 로그인 시 토큰 발행
- 클라이언트한테 받은 회원정보가 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에서 인증토큰 설정되어 호출된 것을 확인할 수 있다.
'RestFul API' 카테고리의 다른 글
[RestFul API] Flask에서 JWT 설치방법 및 설정방법 (0) | 2024.05.22 |
---|---|
[RestFul API] Python MySQL Connector 특정값 삭제(Delete)하기 (0) | 2024.05.21 |
[RestFul API] Python에서 MySQL DB에 데이터 저장(POST) 하는 방법 (0) | 2024.05.21 |
[RestFul API] Config 파일 생성하여 연동하기, Github 리포지토리 private 변경하기 (0) | 2024.05.21 |
[RestFul API] 가상환경 설정 + Flask 프레임워크와 Flask-restful 라이브러리 설치 (0) | 2024.05.20 |