Dj-rest-auth Как аутентифицировать пользователя с REST_USE_JWT = True при тестировании

У меня есть сайт на Django Rest Framework, который использует dj-rest-auth в качестве аутентификации. Я включил REST_USE_JWT = True в моем settings.py. Я хочу протестировать некоторые API, которые требуют rest_framework.permissions.IsAuthenticated. Я создаю клиента с rest_framework.test.APIClient() в моем тесте. Я пытаюсь войти и просмотреть некоторые API, но получаю HTTP_401_UNAUTHORIZED. Я пытаюсь войти, используя имя пользователя, email и пароль в dj-rest-auth login url, и получаю ответ access_token, refresh_token и т.д. Затем использую credentials() для включения его в заголовок. Но клиент все равно получил HTTP_401_UNAUTHORIZED. Я не знаю, правильно ли я делаю. Пожалуйста, помогите мне аутентифицировать клиента в тесте. Заранее спасибо!

class ProfileTests(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.username = "test"
        cls.email = "test@test.com"
        cls.password = "test"
        cls.user = get_user_model().objects.create_user(
            username=cls.username,
            email=cls.email,
            password=cls.password,
        )

        cls.authenticated_client = APIClient()
        response = cls.authenticated_client.post(
            reverse("rest_login"),
            {
                "username": cls.username,
                "email": cls.email,
                "password": cls.password,
            },
            format="json"
        )
        cls.authenticated_client.credentials(HTTP_AUTHORIZATION=settings.JWT_AUTH_COOKIE + " " + response.data["access_token"])

Вы можете войти в систему через dj-rest-auth login url под названием rest_login и затем получить access_token. После этого вы можете использовать метод credentials() из rest_framework.test.APIClient. Этот метод может быть использован для установки заголовков, которые затем будут включены во все последующие запросы тестового клиента. Вот пример

cls.authenticated_client = APIClient()
response = cls.authenticated_client.post(
    reverse("rest_login"),
    {
        "username": cls.username,
        "password": cls.password,
    },
    format="json"
)
cls.authenticated_client.credentials(HTTP_AUTHORIZATION="Bearer " + response.data["access_token"])

Обратите внимание, что в качестве заголовка Authorization используется Bearer вместо Token. Для того чтобы очистить заголовок, просто вызовите credentials() без параметра, пример cls.authenticated_client.credentials(). Если у вас есть другой способ аутентификации пользователя во время тестирования с помощью dj-rest-auth, не стесняйтесь добавить свой ответ в этот вопрос

Вернуться на верх