상세 컨텐츠

본문 제목

JWT 인증토큰 활용

coding/API

by golduny_zoo 2021. 4. 8. 15:20

본문

728x90

회원정보를 가져오는 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 ) 인증방식 사용했다. 


install

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) 

 

 

받아온 토큰 값

 

 


토큰을 이용한 API사용

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를 실행종료하는 순간 아이디의 토큰의 정보가 사라지면 저런 메세지가 뜬다. 

메모리가 날라가니깐 (해킹의 위험성이 줄어든다.)

'coding > API' 카테고리의 다른 글

[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

관련글 더보기