Несколько классов аутентификации Django не пробует все классы, сначала происходит сбой - PullRequest
0 голосов
/ 21 апреля 2020
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'michan_api.utils.validators.ExampleAuthentication'
    ),

Итак, я настроил это в настройке REST_FRAMEWORK в DRF. Но он не пробует все классы. Если первый выдает исключение, он терпит неудачу.

        for authenticator in self.authenticators:
            try:
                user_auth_tuple = authenticator.authenticate(self)
            except exceptions.APIException:
                self._not_authenticated()
                raise

Этот фрагмент кода отвечает за это. (https://github.com/encode/django-rest-framework/blob/master/rest_framework/request.py#L373)

Как заставить его попробовать все классы?

1 Ответ

1 голос
/ 21 апреля 2020

Django Документация по структуре REST говорит:

Метод должен возвращать два кортежа (user, auth), если аутентификация прошла успешно, или None в противном случае.

В некоторых случаях вместо возврата None вы можете вызвать исключение AuthenticationFailed из метода .authenticate ().

Как правило, вы должны использовать следующий подход:

  • Если аутентификация не предпринята, верните None. Любые другие схемы аутентификации, которые также используются, будут по-прежнему проверяться.
  • Если попытка аутентификации не удалась, выдается исключение AuthenticationFailed. Ответ об ошибке будет возвращен немедленно, независимо от каких-либо проверок разрешений и без проверки каких-либо других схем аутентификации.

В соответствии с django-rest-framework-jwt он будет не позволяет попробовать другую аутентификацию, если:

  • ваш токен недействителен
  • ваш Authorization заголовок не соответствует синтаксису Authorization: <string> <string> с <string> фактическая строка без пробелов.

Если ваши учетные данные не соответствуют этому формату, django-rest-framework-jwt будет напрямую отклонять любые попытки аутентификации. В зависимости от ваших требований вам нужно либо исправить учетные данные клиента, либо открыть проблему, либо лучше открыть запрос на извлечение - на django-rest-framework-jwt.

...