Django - Ninja API 인증에 Redis 추가로 blacklist 구현

제목이 거창한데  Django Ninja API 엔진에 기본 인증 방식에 Redis 를 이용하여 사용자별 JWT 토큰 값을 하나만 관리하도록 설정해 보았다. 머 Blacklist 비슷한거 아닌가?

 

로그인 한 후에 Redis 에 사용자 ID 키로 토큰을 저장해 두고, 다시 Login API가 호출되면 새로운 token이 발행되도록 한다. 이렇게 하면 사용기한이 남은 토큰이라도 재 발행되는 순간 쓸 수가 없게 된다.

 

Redis 대신에 그냥 Session 정도 사용되도 될 듯 하지만 머 일단 구색으로

 

class AuthBearer(HttpBearer):
    def authenticate(self, request, token):
        try:
            print(request.headers)
            print(request.headers["User-Agent"])
            a = jwt.decode(token, SECRET_KEY, algorithms="HS256")
            user = User.objects.filter(id=a["id"]).get()
            get_token = cache.get(a["id"])
            print(get_token)
            if get_token == token:
                return a
        except Exception:
            print("Exception - ", Exception)
            
        return False

 

먼저 토큰을 확인해 보고 이상이 없더라도 Redis 에 저장된 토큰이랑 한 번 더 비교하도록 하였다.

 

API에 적용시키는 방법은 Ninja API 매뉴얼에 있듯이 아래처럼 

 

@api.get("product", response=ProductOutListSchema, auth=AuthBearer())
# @login_required(login_url="/api/v1/error")
def list_product(request, q: QueryStringItem = Query(...)):
    print("=== list_productbyuser ===", request, q.dict(), request.auth)

 

Redis 설치후에 장고 쪽에 라이브러리를 설치하고,

 

$ python -m pip install django-redis

https://github.com/jazzband/django-redis

 

GitHub - jazzband/django-redis: Full featured redis cache backend for Django.

Full featured redis cache backend for Django. Contribute to jazzband/django-redis development by creating an account on GitHub.

github.com

 

settings.py 에 아래 문구를 참고해서 설정해야 한다.

# CACHE
CACHE_LOCATION = "redis://" + os.environ.get("CACHE_HOST", "127.0.0.1") + ":" + os.environ.get("CACHE_PORT", "6379") + "/1"
print(CACHE_LOCATION)

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": CACHE_LOCATION,
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    }
}

 

장고에서 Redis cache 의 기본 사용법은 아래 링크 글이 좋더라 참고하세요 :)

https://velog.io/@jiffydev/Django-16.-Django-django-redis

 

Django 16. Django & django-redis

1. Redis란? > Redis (Remote Dictionary Server) is an in-memory data structure project implementing a distributed, in-memory key–value database with opt

velog.io

 

끝.

 

해가 좋던데 바다 보며 쉬고 싶당

GEORGE DESIPRIS 님의 사진, 출처: Pexels