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, не стесняйтесь добавить свой ответ в этот вопрос