지금까지 django에서 지원하는 사용자에 대한 기능을 사용 해 본적이 없다.
(request.user 조차도) 그래서 여러가지 기능을 사용하며 프로젝트의 Settings.py에 선언된 몇 가지를 기록하려 한다.
종류는 아래와 같다.
나는 유저 관리를 JWT, User Password 등 여러가지 API를 PyJWT와 bcrypt등 라이브러리를 사용하여 직접 구현했다(직접 다 만들어야 하는 줄 알았다. Django가 어느 부분까지 지원 해 주는지 명확히 알지못했음). 나는 request.user로 User를 특정 해 줄수 있는걸 안지 오래되지 않았다. token 복호화 decorator를 직접 만들어 썼기 때문에 이게 최선인줄 알았다..
DRF로 API를 쉽게 컨트롤 할 수 있도록 세팅한 것이다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', # 인증된 사용자만 접근 가능
'rest_framework.permissions.IsAdminUser', # 관리자만 접근 가능
'rest_framework.permissions.AllowAny', # 누구나 접근 가능
),
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
# 'rest_framework_jwt.authentication.JWTAuthentication',
# 'rest_framework.authentication.TokenAuthentication',
# 'rest_framework.authentication.SessionAuthentication',
# 'rest_framework.authentication.BasicAuthentication',
),
}
DEFAULT_PERMISSION_CLASSES: API에 권한을 부여 해 줄때 BasePermission으로 접근 가능한 permission 이다.
DEFAULT_FILTER_BACKENDS: API에 filter로 사용 할 세팅을 정의
DEFAULT_RENDERER_CLASSES: API에 기본적인 rederer 선언
DEFAULT_AUTHENTICATION_CLASSES: request.user로 토큰을 판별 할 토큰 설정 정의
UPDATE_LAST_LOGIN = True
UPDATE_LAST_LOGIN에 True이면, 로그인 할 때 User 컬럼 내에 last_login에 업데이트 된다.JWT를 사용하기 위해 찾던 중 여러가지 패키지가 있지만 DRF에 최적화 되어 있고, 최근까지 업데이트 된 패키지 였기에 선택했다. API에서 request.user로 User 특정 가능(token을 복호화 해줌).이렇게 간단한 방법이 있는데 왜 나는 데코레이터를 만들어 모든 api에 적용하려 했을까?
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(hours=15),
# access_token 유효시간
'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
# refresh_token 유효시간
'ROTATE_REFRESH_TOKENS': True,
# True이면 refresh api에 토큰을 이력하면 refresh_token과
# access_token이 함께 재발급 된다
'BLACKLIST_AFTER_ROTATION': True,
# True이면 기존에 사용하던 refresh토큰은 사용 할 수 없도록, blacklist에 저장
'UPDATE_LAST_LOGIN': True,
'ALGORITHM': ALGORITHM,
'SIGNING_KEY': SECRET_KEY,
# Token 만들 때, Algorithm과 Secret_key가 필요하기에 넣어 준다.
'AUTH_HEADER_TYPES': ('Bearer',),
# 보통의 경우에 Bearer Token을 사용하기에 Token 앞에 수식어?로 들어올 단어 set
}
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },
# username, first_name, last_name, email 중에 70% 만큰 일치하면 오류 발생
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {'min_length': 9}
},
# 비밀번호 최소 길이 9
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
# django내에 gzip으로 저장된 자주 쓰이는 비밀번호 20000개 중 하나면 오류 발생
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', },
# only 숫자로만 된 비밀번호이면 오류 발생
]
# 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'
class UserAttributeSimilarityValidator:
DEFAULT_USER_ATTRIBUTES = ("username", "first_name", "last_name", "email")
def __init__(self, user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7):
self.user_attributes = user_attributes
if max_similarity < 0.1:
raise ValueError("max_similarity must be at least 0.1")
self.max_similarity = max_similarity
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.ScryptPasswordHasher',
]