You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用REST_USE_JWT=True时,如何在测试中通过dj-rest-auth认证用户?

解决DRF测试中使用dj-rest-auth JWT认证的401问题

你遇到的核心问题是认证头格式错误,另外可以用更简便的方式完成测试认证,以下是两种解决方案:

方案一:修正JWT认证头格式

你误用了JWT_AUTH_COOKIE的值作为认证前缀,DRF的JWT认证后端只识别标准的Bearer前缀,而不是cookie名称。同时登录请求无需同时传username和email,二选一即可。

修改后的代码:

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,
                "password": cls.password,
            },
            format="json"
        )
        # 使用标准Bearer前缀设置认证头
        cls.authenticated_client.credentials(HTTP_AUTHORIZATION=f"Bearer {response.data['access_token']}")

方案二:直接强制认证(测试更高效)

DRF测试客户端提供了force_authenticate方法,不需要调用真实登录接口就能完成用户认证,这是测试场景下更推荐的方式:

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()
        # 直接绑定认证用户,跳过登录流程
        cls.authenticated_client.force_authenticate(user=cls.user)

补充说明

JWT_AUTH_COOKIE是dj-rest-auth用来存储JWT的cookie名称,前端通过自动携带cookie完成认证,但后端接口的HTTP请求头认证必须遵循Bearer <token>的格式,这是JWT的标准规范,也是DRF JWT认证后端的识别规则,这就是你之前返回401的根本原因。

内容的提问来源于stack exchange,提问作者whoami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:55:15