使用APIRequestFactory测试基于令牌的身份验证的正确方法是什么?

朋克摇滚

到我的端点的查询工作正常(只要我向它传递一个有效的令牌),它就返回我的响应数据的json表示形式。

服务api中的代码调用我的端点,并在标头中传递auth令牌:

headers = {'content-type': 'application/json',
           'Authorization': 'Token {}'.format(myToken)}
url = 'http://localhost:8000/my_endpoint/'
r = session.get(url=url, params=params, headers=headers)

在views.py中,我有一个方法装饰器,用于将分派方法包装在视图上(viewsets.ReadOnlyModelViewSet):

def login_required(f):
    def check_login_and_call(request, *args, **kwargs):
        authentication = request.META.get('HTTP_AUTHORIZATION', b'')
        if isinstance(authentication, str):
            authentication = authentication.encode(HTTP_HEADER_ENCODING)
        key = authentication.split()
        if not key or len(key) != 2:
            raise PermissionDenied('Authentication failed.')
        user, token = authenticate_credentials(key[1])
        return f(request, *args, **kwargs)
    return check_login_and_call

我正在尝试编写测试以使用令牌对请求进行身份验证:

from rest_framework.authtoken.models import Token
from rest_framework.test import APIRequestFactory
from rest_framework.test import APITestCase
from rest_framework.test import force_authenticate

class EndpointViewTest(APITestCase):
    def setUp(self):
        self.factory = APIRequestFactory()
        self.user = User.objects.create_user(
            username='[email protected]', email='[email protected]', password='top_secret')
        self.token = Token.objects.create(user=self.user)
        self.token.save()

    def test_token_auth(self):
        request = self.factory.get('/my_endpoint')
        force_authenticate(request, token=self.token.key)
        view = views.EndpointViewSet.as_view({'get': 'list'})
        response = view(request)
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.render().content)['results']

由于某些原因,我无法获得正确通过此测试的令牌的请求。使用force_authenticate似乎并没有更改我用于验证令牌的标头。当前输出显示“ PermissionDenied:身份验证失败”。因为未在请求上设置令牌。

是否有适当的方法可以在测试中的请求标头中进行设置,或者重构我最初使用它的方式?

朋克摇滚

我找到了一种通过测试的方法,但是如果您对如何处理这些问题有更好的想法,请发表。

request = self.factory.get('/my_endpoint', HTTP_AUTHORIZATION='Token {}'.format(self.token))
force_authenticate(request, user=self.user)

更改测试的上述两行之后,似乎可以根据令牌正确进行身份验证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C#(Web API)中测试身份验证方法(使用承载令牌)的正确方法

禁用SSH密码身份验证的正确方法是什么

使用服务主体对 Azure 函数应用进行身份验证的正确方法是什么?

在 MailKit 中使用 GMail OAuth2.0 进行身份验证的正确方法是什么?

在RESTClient中使用ntlm身份验证的正确方法是什么?

在ServiceStack中建议用于提供基于令牌的身份验证的实施模式是什么?

验证不同类型用户的身份验证令牌的最佳方法是什么?

在 React 应用程序中使用访问令牌实现身份验证的最佳方法是什么?

Google Picker API 身份验证令牌是什么格式?

在NodeJS应用中为远程API存储身份验证令牌的最佳方法是什么?

在使用props进行响应时传递身份验证令牌的安全风险是什么?

使用 JWT 令牌进行身份验证的最佳实践是什么?

使用Spring和JWT进行基于令牌的身份验证

Jira 是否使用基于令牌的身份验证?

使用基于令牌的新身份验证进行VoIP推送?

使用Dapper micro-orm的基于令牌的身份验证

使用Jwt的基于令牌的身份验证无法授权

通过Google进行身份验证以使用Admin SDK中的Google Directory API的正确方法是什么?

如何正确使用 GitHub 的身份验证令牌?

春季安全令牌基于身份验证

基于令牌的身份验证中的会话

Laravel基于令牌的用户身份验证?

REST API基于令牌的身份验证

MQTT Broker基于令牌的身份验证

基于令牌的REST API身份验证

基于令牌的身份验证 MVC 5

对 GCP Cloud Tasks enqueue API 进行身份验证的正确方法是什么?

Asp.NET Core + ReactJs-存储身份验证信息的正确方法是什么?

为 Web 应用程序设置身份验证和授权的正确方法是什么