상세 컨텐츠

본문 제목

JWT 인증 토큰 로그인/로그아웃

coding/API

by golduny_zoo 2021. 4. 8. 15:48

본문

728x90

인증 토큰을 만들어 봤으니

로그인할때 user_id 에 대한 인증토큰을 받아오고, 

(내가 적은 글을 마음대로 삭제할 수 없도록 로그인의 토큰을 이용하여 보호를 할 수 있다.)

로그아웃을 할때도 인증 토큰을 활용해봤다. 

(다른 접속자가 내 아이디를 마음대로 로그아웃을 하는 것도 문제이기 때문)

 

2021.04.08 - [coding/API] - JWT 인증토큰 활용

 

JWT 인증토큰 활용

회원정보를 가져오는 API를 만들었다. GET을 사용하여 가져왔으나, 문제는 개인정보를 아무나 볼 수 있다는 것이 문제였다. class UserResource(Resource): # login API def post(self): # 회원정보 API def get(s..

golduny.tistory.com

레퍼런스의 자료를 보고 참고하여 작성할 수 있다. 

레퍼런스 : flask-jwt-extended.readthedocs.io/en/stable/blocklist_and_token_revoking/


로그인/로그아웃을 위한 코드 

1. resource.py

 

login 함수를 만들어 주기 전에 전역변수로 blocklist를 set으로 할당한다.

jwt_blocklist = set()

 

2. app.py

 

위에서 설정한 blocklist를 import 한다.

from resources.user import jwt_blocklist

 

로그인/로그아웃 관리를 위한 jwt설정 함수 

## 로그인/로그아웃 관리를 위한 jwt설정
@jwt.token_in_blocklist_loader

def check_if_token_is_revoked(jwt_header, jwt_payload):

jti = jwt_payload['jti']

return jti in jwt_blocklist

그리고 login 함수가 들어있는 resource.py와 연결 시켜 준다.

api.add_resource(UserResource,'/user/login')

로그인

3. resource.py 로그인 기능 구현

class UserResource(Resource):
    # login API
    def post(self):
        data = request.get_json()
        print(data)
        if "email" not in data or "password" not in data:
            return {'error_code': "input your password or email"}, HTTPStatus.BAD_REQUEST

        connection = get_mysql_connection()
        cursor = connection.cursor(dictionary =True)

        try:
            # Validate.
            valid = validate_email(data['email'])

        except EmailNotValidError as e:
            # email is not valid, exception message is human-readable
            print(str(e))
            return {'error_code':'not valid email'},HTTPStatus.BAD_REQUEST

        query = '''select id, password
                    from user
                    where email = %s;'''

        param = (data['email'],)

        cursor.execute(query, param)
        records = cursor.fetchall()
    
        if records == []:
            return {'error_code':'not exist email'}

        cursor.close()
        connection.close()
        
        # JWT를 이용해서 인증토큰을 생성해 준다. 
        

        password = check_passwd(data['password'],records[0]['password'])
        if password is True:

            user_id = records[0]['id']
            access_token = create_access_token(identity=user_id)

            return {'message': 'access login', 'token': access_token},HTTPStatus.OK
        else:
            return {'message': 'wrong password'},HTTPStatus.BAD_REQUEST

로그아웃

4. resource.py 로그아웃 기능 구현

from flask_jwt_extended importget_jwt

 

#로그아웃 API 
class UserLogoutResource(Resource):
    @jwt_required()
    def post(self):
        # 로그아웃을 위한 레퍼런스를 따라하는 것
        jti = get_jwt()['jti']
        jwt_blocklist.add(jti)

        return {'message':'logout'},HTTPStatus.OK

'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

관련글 더보기