Один токен работает для всех аккаунтов django rest framework
Создал систему авторизации через токен, пользователь вводит емайл и пароль, возвращается токен, далее этот токен идет в заголовке всех остальных запросов. Все работает, но заметил что один токен подходит для всех аккаунтов. То есть, можно ввести любые email и пароль, но если прикреплен какой-нибудь из существующих токенов, то запрос пройдет. Разве это нормально? Один токен должен работать только с одним аккаунтом. Что я сделал не так? Permission class на всех view стоит IsAuthenticated.
views.py (тут функция просто для теста, возвращает список всех аккаунтов)
class AccountLoginTest(generics.ListAPIView):
permission_classes = (IsAuthenticated,)
serializer_class = UserSerializer
def get_queryset(self):
acc = Account.objects.all()
return acc
serializers.py (сериалайзер аккаунтов)
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(min_length=7, write_only=True)
def create(self, validated_data):
user = Account.objects.create_user(validated_data['username'], validated_data['email'],
validated_data['password'])
return user
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
urls.py
urlpatterns = [
path('account/testGet/', views.AccountLoginTest.as_view()),
]
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'account',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', ),
}
AUTH_USER_MODEL = 'account.Account'
ACCOUNT_USER_MODEL_USERNAME_FIELD = 'username'
ACCOUNT_USERNAME_REQUIRED = True
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_AUTHENTICATION_METHOD = 'email'
SOCIALACCOUNT_QUERY_EMAIL = True
Ответы (1 шт):
Ну смотрите, что я вижу...У вас установлена Django и в качестве расширений используется DjangoRestFraemwork
В качестве средства аутентифкации вы указали:
rest_framework.authentication.TokenAuthentication
Этот модуль делает только проверку наличия токена + проверку того, что у этого токена не истек срок годности.
То есть ваш вопрос:
То есть, можно ввести любые email и пароль, но если прикреплен какой-нибудь из существующих токенов, то запрос пройдет. Разве это нормально?
в данной ситуации несколько не уместен. Посколько TokenAuthentication проверил, что токен есть и этот токен еще валиден. И все... Больше он ничего не делает.
А то что этот токен прикреплен к другой учетной записи, так это проблема не аутентификации, а авторизации.
По факту, ваша ситуация выглядит таким образом: токен это как пропуск, тот у кого пропуск может проходить на предприятие. Охранник стоящий на входе проверяет толлько наличие пропуска, но он не сверяет фотографии тех кому был выдан этот пропуск. Предпологается, что пропуском пользуется только его владелец. А вы взяли отдали свой пропуск другому человек - соответвенно он прошел на предприятие без проблем