1. 로그아웃 API
from flask_restful import Resource
from flask_jwt_extended import jwt_required, get_jwt
# 로그아웃된 토큰을 저장할 set을 만든다.
jwt_blocklist = set()
class UserLogoutResource(Resource):
@jwt_required()
def post(self):
# print(get_jwt())
jti = get_jwt()['jti']
# print(jti)
jwt_blocklist.add(jti)
return {'result' : 'success'}, 200
중복을 방지하기 위해 blocklist를 set으로 만들고
메소드를 실행하면 현재의 access_token을 blocklist에 추가한다.
2. 메인파일
from flask import Flask
from flask_restful import Api
from config import Config
from flask_jwt_extended import JWTManager
from resources.user import UserRegisterResource, UserLoginResource, UserLogoutResource
from resources.user import jwt_blocklist
app = Flask(__name__)
# 환경변수 셋팅
app.config.from_object(Config)
# JWT 매니저 초기화(initialize)
# JWTManager(app)을 설정해줘야 flask istance에서 jwt를 사용할 수 있게 된다.
jwt = JWTManager(app)
# 로그아웃된 토큰으로 요청하는 경우 처리하는 코드작성.
@jwt.token_in_blocklist_loader
def check_if_token_is_revoked(jwt_header, jwt_payload):
jti = jwt_payload['jti']
return jti in jwt_blocklist
api = Api(app)
# 경로와 리소스를 연결한다.
api.add_resource(UserRegisterResource, '/user/register')
api.add_resource(UserLoginResource, '/user/login')
api.add_resource(UserLogoutResource, '/user/logout')
if __name__ == '__main__':
app.run()
@jwt.token_in_blocklist_loader 데코레이터 다음 부분은 콜백함수로,
blocklist에 포함된 token으로 요청이 들어오면 요청을 거부한다.
3. 포스트맨으로 테스트
현재 로그인 한 사람의 token을 헤더에 주고 로그아웃을 실행했다.
이 token으로 로그인이 필요한 다른 API를 실행하면 어떻게 될까?
만료된 토큰이기 때문에 에러가 발생했다.
비주얼 스튜디오 코드의 에러창에도 RevokedTokenError라고 명시되어 있다..
'REST API' 카테고리의 다른 글
Flask - PROPAGATE_EXCEPTIONS에 대한 이해 (0) | 2023.01.06 |
---|---|
Flask에서 JWT 사용하기 (flask-jwt-extended) (0) | 2023.01.05 |
API서버 - Flask JWT를 사용해 로그인 한 유저만 처리하는 API 만들기 (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 로그인 API 만들기 (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 회원가입 API 만들기 (2) | 2023.01.05 |