django dj-rest-auth如何在测试时验证REST_USE_JWT = True的用户

a11xaf1n  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(147)

我有Django Rest Framework站点使用dj-rest-auth作为验证。我在我的settings.py中启用REST_USE_JWT = True。我想测试一些需要rest_framework.permissions.IsAuthenticated的API。我在测试中使用rest_framework.test.APIClient()创建客户端。我尝试登录并查看一些API,但我得到了HTTP_401_UNAUTHORIZED。我尝试登录后将用户名、电子邮件和密码发送到dj-rest-auth登录URL,并得到响应access_token,refresh_token等,然后使用credentials()将其包含在header中,但客户端仍然得到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"])
yhxst69z

yhxst69z1#

您可以通过名为rest_login的dj-rest-auth登录url登录,然后获取access_token。之后,您可以使用rest_framework.test.APIClient中的credentials()方法。此方法可用于设置标头,这些标头随后将包含在测试客户端的所有后续请求中。

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"])

请注意,它使用Bearer而不是Token作为Authorization头。要清除头,只需调用credentials()(不带参数)示例cls.authenticated_client.credentials()。如果您在使用dj-rest-auth进行测试期间有其他方法验证用户身份,请随时在此问题中添加您的答案

相关问题