Skip to content

Commit

Permalink
Add TokenAuthentication
Browse files Browse the repository at this point in the history
  • Loading branch information
TheSuncatcher222 committed Nov 25, 2023
1 parent 76bb131 commit b7f27a5
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 12 deletions.
23 changes: 15 additions & 8 deletions backend/api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
from api.v1.serializers import CustomTokenObtainPairSerializer
from api.v1.views import (
AppealViewSet,
CustomTokenObtainPairView, CustomTokenRefreshView,
CustomAuthToken, CustomTokenObtainPairView, CustomTokenRefreshView,
NewsViewSet, UserViewSet,
)
from urban_utopia_2024.app_data import AUTH_TOKEN, AUTH_JWT
from urban_utopia_2024.settings import AUTH_TYPE

router: DefaultRouter = DefaultRouter()

Expand All @@ -25,13 +27,18 @@
basename=route.get('prefix'),
)

token_urls = [
path('create/', CustomTokenObtainPairView.as_view(
serializer_class=CustomTokenObtainPairSerializer,
), name='token_obtain_pair'
),
path('refresh/', CustomTokenRefreshView.as_view(), name='token_refresh'),
]
if AUTH_TYPE == AUTH_JWT:
token_urls = [
path('create/', CustomTokenObtainPairView.as_view(
serializer_class=CustomTokenObtainPairSerializer,
), name='token_obtain_pair'
),
path('refresh/', CustomTokenRefreshView.as_view(), name='token_refresh'), # noqa (E501)
]
elif AUTH_TYPE == AUTH_TOKEN:
token_urls = [
path('create/', CustomAuthToken.as_view(), name='token_obtain')
]

docs_urlpatterns = [
path('schema/', SpectacularAPIView.as_view(), name='schema'),
Expand Down
40 changes: 39 additions & 1 deletion backend/api/v1/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from django.contrib.auth import authenticate
from django.shortcuts import get_object_or_404
from drf_spectacular.utils import extend_schema, extend_schema_view
from rest_framework import serializers, status
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.permissions import IsAdminUser, IsAuthenticated
from rest_framework.decorators import action
from rest_framework.response import Response
Expand All @@ -17,14 +20,49 @@
UserFullSerializer, UserRegisterSerializer,
)
from api.v1.schemas_views import (
APPEAL_SCHEMA, NEWS_SCHEMA, TOKEN_OBTAIN_SCHEMA,
APPEAL_SCHEMA, DEFAULT_400_REQUIRED, NEWS_SCHEMA, TOKEN_OBTAIN_SCHEMA,
TOKEN_REFRESH_SCHEMA, USERS_SCHEMA,
)
from info.models import Appeal, News, NewsComment
from urban_utopia_2024.app_data import APPEAL_STAGE_COMPLETED
from user.models import User


class CustomAuthToken(ObtainAuthToken):

def post(self, request, *args, **kwargs):
email: str = request.data.get('email')
password: str = request.data.get('password')
if email is None or password is None:
return Response(
data={
'email': DEFAULT_400_REQUIRED,
'password': DEFAULT_400_REQUIRED,
},
status=status.HTTP_400_BAD_REQUEST,
)
user: User = authenticate(email=email, password=password)
if not User:
return Response(
data={
'detail': 'Указаны неверные email или password.'
},
status=status.HTTP_401_UNAUTHORIZED,
)
token, _ = Token.objects.get_or_create(user=user)
response_data: dict[str, str] = {
'token': token.key,
'user_id': user.pk,
}
for attr in ('is_municipal', 'is_staff'):
if getattr(user, attr):
response_data[attr]: bool = True
return Response(
data=response_data,
status=status.HTTP_200_OK,
)


@extend_schema_view(**APPEAL_SCHEMA)
class AppealViewSet(ModelViewSet):
"""ViewSet для взаимодействия с моделью обращений."""
Expand Down
4 changes: 4 additions & 0 deletions backend/urban_utopia_2024/app_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@

"""Security data."""


AUTH_TOKEN: str = 'auth_token'
AUTH_JWT: str = 'auth_JWT'

CITE_DOMAIN: str = os.getenv('CITE_DOMAIN')
CITE_IP: str = os.getenv('CITE_IP')

Expand Down
20 changes: 17 additions & 3 deletions backend/urban_utopia_2024/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from corsheaders.defaults import default_headers

from urban_utopia_2024.app_data import (
AUTH_TOKEN, AUTH_JWT,
BASE_DIR,
DATABASE_SQLITE, DATABASE_POSTGRESQL,
CITE_DOMAIN, CITE_IP, SECRET_KEY,
Expand All @@ -15,6 +16,8 @@

DEBUG = False

AUTH_TYPE: str = AUTH_TOKEN


"""Celery settings."""

Expand Down Expand Up @@ -57,6 +60,15 @@
'django_celery_beat',
]

if AUTH_TYPE == AUTH_TOKEN:
INSTALLED_APPS_THIRD_PARTY.append(
'rest_framework.authtoken',
)
elif AUTH_TYPE == AUTH_JWT:
INSTALLED_APPS_THIRD_PARTY.append(
'rest_framework_simplejwt',
)

INSTALLED_APPS_LOCAL = [
'api',
'info',
Expand All @@ -66,15 +78,17 @@
INSTALLED_APPS = INSTALLED_APPS_DJANGO + INSTALLED_APPS_THIRD_PARTY + INSTALLED_APPS_LOCAL

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny'
],
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

if AUTH_TYPE == AUTH_JWT:
REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = [
'rest_framework_simplejwt.authentication.JWTAuthentication',
]

ROOT_URLCONF = 'urban_utopia_2024.urls'

SPECTACULAR_SETTINGS = {
Expand Down

0 comments on commit b7f27a5

Please sign in to comment.