启用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
相关产品推荐
相关产品推荐

