【问题标题】:How to pass the user token for API testing in django rest framework?如何在 django rest 框架中传递用户令牌以进行 API 测试?
【发布时间】:2019-10-28 03:39:55
【问题描述】:

我正在编写一些测试来检查与我的 API 的连接。

我已经通过令牌进行了识别,并且我成功地为特定测试用户检索了令牌:

token = Token.objects.get(user__username='testuser')

我正在努力使用该令牌来创建一个成功的 API 请求:

client = APIClient(HTTP_AUTHORIZATION='Token ' + token.key)
response = client.get('/patientFull/1/',headers={'Authorization': 'Token ' + token.key})

我一直在寻找许多方法来完成这项工作,这些是我尝试过的一些方法:

response = requests.get('http://127.0.0.1:8000/patientFull/1/',headers={'Authorization': 'Token ' + token.key} )


client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
response = client.get('/patientFull/1/')

测试是一个简单的断言来检查响应是否有来自服务器的 200 OK HTTP 响应。

以上所有这些方式都返回 403 HTTP 响应。

这是我的测试的完整代码(我正在使用fixture 用测试数据填充我的测试数据库):

import json
import requests
from rest_framework.authtoken.models import Token
from rest_framework.test import APIRequestFactory, APITestCase, APIClient


class CustomerAPITestBack(APITestCase):
    fixtures = ['new-fixtures.json']

    def testDE(self):
        token = Token.objects.get(user__username='jpmichel')
        client = APIClient(HTTP_AUTHORIZATION='Token ' + token.key)
        response = client.get('/patientFull/1/',headers={'Authorization': 'Token ' + token.key})
        self.assertEqual(200, response.status_code)

我已经为令牌配置了我的 settings.py 文件:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'PHCAdmin.authentication.tokenAuthentication.ExpiringTokenAuthentication',
    ),
    'EXCEPTION_HANDLER': 'PHCAdmin.functions.pxlth_exception_handler',
}

REST_FRAMEWORK_EXPIRY_TIME = 12 # in hours
REST_FRAMEWORK_PASSWORD_RENEWALS = 90 # in days

如果我禁用令牌身份验证,则此测试通过(GET 返回 200 OK)

我应该如何执行我的 GET 请求,以便它使用令牌识别为有效用户并返回 200 OK HTTP 响应?

【问题讨论】:

  • 如果你只需要对用户进行身份验证来测试其他功能,那么你应该看看force_authenticate方法。
  • 你可以在测试中尝试先登录,然后像真实用户一样做任何你想做的事情
  • @5parkp1ug 不会使用强制身份验证使令牌无用?
  • 如上所述,该函数可用于测试经过身份验证的端点功能。 force_authenticate 绕过身份验证。如果您希望执行基于令牌的身份验证,我建议您查看credentials 方法。
  • 我在这里可能错了,但看起来你的问题不是令牌身份验证。如果您的请求未通过身份验证,您将收到 401 Unauthorized。相反,您会收到 403 Forbidden,这通常是授权失败的响应,而不是身份验证失败的响应。检查您使用的令牌是否确实具有访问您请求的端点所需的权限。

标签: django django-rest-framework django-testing


【解决方案1】:

只是为了结束这个问题: 经过一番研究,我发现服务器上的令牌与本地机器上的不一样,我只需要更新双方的令牌。 上面的代码运行良好。

【讨论】:

    【解决方案2】:

    我来这里是为了寻找 force_authenticate 在使用令牌时不起作用的答案。对于相同情况的人,您需要以这种方式指定用户和令牌:

    client = APIClient()
    client.force_authenticate(user=UserInstance, token=UserInstanceToken)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-11
      • 2015-06-21
      • 1970-01-01
      • 2021-09-03
      • 2018-05-15
      • 2014-12-24
      • 2016-05-25
      • 2018-12-15
      相关资源
      最近更新 更多