如何在 DRF 测试中使用 JWT 令牌?

Posted

技术标签:

【中文标题】如何在 DRF 测试中使用 JWT 令牌?【英文标题】:How can I use JWT token in DRF tests? 【发布时间】:2020-10-23 19:52:31 【问题描述】:

我需要测试我的 API。例如,我有图像列表页面。我需要对此页面进行测试,但如果没有身份验证,我无法做到这一点。我使用智威汤逊。我不知道怎么做。 请帮帮我。

tests.py

class ImagesListTestCase(APITestCase):
    def test_images_list(self):
        response = self.client.get('/api/', HTTP_AUTHORIZATION="JWT ".format("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTkzNzUxMzMxLCJqdGkiOiI3NWE3NDNkMGU3MDQ0MGNiYjQ3NDExNjQ3MTI5NWVjNSIsInVzZXJfaWQiOjF9.7HkhZ1hRV8OtQJMMLEAVwUnJ0yDt8agFadAsJztFb6A"))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

我试过了

response = self.client.get('/api/', Authorization="Bearer <token>")

还有

response = self.client.get('/api/', Authorization="JWT <token>")

response = self.client.get('/api/', HTTP_AUTHORIZATION="Bearer <token>")

【问题讨论】:

先获取JWT令牌。 那我该怎么办? 阅读您的 api 文档以了解附加令牌的方式,并阅读您的 http 客户端文档以了解如何执行此操作。 你有什么错误吗? 【参考方案1】:

django 创建一个临时数据库进行测试;所以最好像这样从usernamepassword 获取令牌:

class ImagesListTestCase(APITestCase):
    def setUp(self) :
    self.register_url = reverse("your:register:view")  # for example : "users:register"
    self.user_data = 
        "username": "test_user",
        "email": "test_user@gmail.com",
        "password": "123456"
    
    self.client.post(self.register_url,self.user_data)      # user created

    auth_url = reverse("your:login:view") #for example :"users:token_obtain_pair"
    self.access_token = self.client.post(auth_url,
        "username" : self.user_data.get("username") ,
        "password" : self.user_data.get("password")
    ).data.get("access")       # get access_token for authorization
    self.client.credentials(HTTP_AUTHORIZATION=f'Bearer self.access_token')
    
    def test_images_list(self):
        response = self.client.get('/api/')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

【讨论】:

【参考方案2】:

您可以创建需要 JWT 身份验证的用户,例如:

    def setUp(self) -> None:
    self.client = APIClient()

    if os.environ.get('GITHUB_WORKFLOW'):
        local_token_url = 'https://testing/app/token/jwt'
    else:
        local_token_url = 'http://127.0.0.1:8000/app/token/jwt'

    response = requests.post(local_token_url, 'email': 'test_contact1@user.com', 'password': '123pass321')
    self.test_user1 = json.loads(response.text)
    response = requests.post(local_token_url, 'email': 'test_contact2@user.com', 'password': '123pass321')
    self.test_user2 = json.loads(response.text)

    self.contact_person = apm.AppUser.objects.create(email="test_contact1@user.com", first_name="John",
                                                     last_name="Doe",
                                                     company_name="test_company_1", phone_number="08077745673",
                                                     is_active=True)

然后您可以像下面那样使用它们解析数据 =

self.client.credentials(HTTP_AUTHORIZATION="Bearer ".format(self.test_user1.get('access')))
    response = self.client.post(reverse('create-list'), data=data, format='json')
    print(response.data)
    self.assertEqual(response.status_code, status.HTTP_201_CREATE

【讨论】:

以上是关于如何在 DRF 测试中使用 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS 和 DRF:如何将 JWT 令牌存储在 HTTPonly cookie 中?

如何使用 DRF djangorestframework-simplejwt 包将 JWT 令牌存储在 HttpOnly cookie 中?

如何使用 DRF JWT 实现记住我的功能?

DRF JWT 在 OPTIONS 请求上不需要令牌

何时在 DRF 中的 jwt 中调用 gettoken、刷新令牌和验证令牌?

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权