회원정보를 가져오는 API를 만들었다.
GET을 사용하여 가져왔으나, 문제는 개인정보를 아무나 볼 수 있다는 것이 문제였다.
class UserResource(Resource):
# login API
def post(self):
# 회원정보 API
def get(self, user_id):
# 데이터 베이스에서 유저 아이디의 정보
# /users/<int:user_id>/my => UserResource Get
# id,email. username, is_active 이 3개 정보를 클라이언트에 응답
# 데이터 베이스 연결
connection = get_mysql_connection()
cursor = connection.cursor(dictionary = True)
# 쿼리문
query = '''select id, email, username, is_active from user
where id = %s ;'''
param =(user_id,)
# 쿼리문 실행
cursor.execute(query, param)
records = cursor.fetchall()
# 닫기
cursor.close()
connection.close()
print(records)
# 유저 정보 리턴
if len(records) == 0:
return {'err_code':1}, HTTPStatus.BAD_REQUEST
else:
return {"massage":records[0]},HTTPStatus.OK
이 문제를 해결 할 수 있는 방식으로
JWT( JSON Web Token ) 인증방식 사용했다.
pip install flask-jwt-extended
레퍼런스 : flask-jwt-extended.readthedocs.io/en/latest/options/
# 유저인증을 위한 JWT 라이브러리 import
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity, get_jwt
1. resource.py
토큰이 필요한 함수 위에 @jwt_requried()을 넣는다.
@jwt_required()
def post(self):
회원가입을 할 때 auto increment된 id값이 필요하다.
하지만
query = ''' insert into user(username, email, password)
values (%s, %s, %s);'''
SQL의 인서트 쿼리를 보면
회원의 아이디 값을 받아 오지 않는다.
하지만 아주 편하게
MySQL-Python-connector의 cursor.lastrowid로 id를 가져올 수 있다.
( getlastrowid()로 받아올수 잇는 사람도 있고, 없는 사람도 있다. 버전차이..?)
커서를 닫기 전에 코드를 넣어주고 변수로 받아온다.
connection = get_mysql_connection()
cursor = connection.cursor()
query = ''' insert into user(username, email, password)
values (%s, %s, %s);'''
param = (data['username'],data['email'],password)
cursor.execute(query,param)
connection.commit()
# print('------------------확인용 -----------------')
user_id = cursor.lastrowid
print(user_id)
user_id를 create_access_token에 identity에 넣고
access_token = create_access_token(identity = user_id)
return에 설정
return {'token': access_token}, HTTPStatus.OK
2. config.py
config.py에 JWT의 암호화를 위한 변수 설정(변수는 마음대로)
class Config :
DEBUG =True
# JWT 암호화를 위한 변수 설정
SECRET_KEY = 'whatever'
3. app.py
##JWTManager 설정
실행 app.py파일에 위에서 config을 import하여 넣어준다.
# 1. 환경변수 설정
app.config.from_object(Config)
## 1-1. JWT 환경 설정
jwt = JWTManager(app)
받아온 토큰 값
import 하고
from flask_jwt_extended import jwt_required, get_jwt_identity
토큰을 사용할 API함수 위에
@jwt_required()를 넣는다.
@jwt_required()
def post(self):
테이블에 user_id 컬럼이 있어야 한다.
그러면 오류났네..Token has expired..
이 메세지는 @jwt_required()을 사용했을 때 보여진다.
app.py를 실행종료하는 순간 아이디의 토큰의 정보가 사라지면 저런 메세지가 뜬다.
메모리가 날라가니깐 (해킹의 위험성이 줄어든다.)
[API] Twilio 문자/전화 서비스 (0) | 2021.05.27 |
---|---|
API 파일 역할 (0) | 2021.04.15 |
API 서버 배포 (serverlessframework) (0) | 2021.04.14 |
JWT 인증 토큰 로그인/로그아웃 (1) | 2021.04.08 |
Restful API란? (0) | 2021.04.06 |