代码之家  ›  专栏  ›  技术社区  ›  Preston

Django在没有授权令牌的情况下响应选项请求

  •  0
  • Preston  · 技术社区  · 7 年前

    我正在测试restapi的响应。如果用户不发送令牌,我希望会发送403响应。

    在下面的测试中,我创建一个用户,创建并获取他们的身份验证令牌(在其他测试中使用),并测试我是否可以发送一个没有身份验证的options请求。

    {
        "detail": "Authentication credentials were not provided."
    }
    

    但我的代码返回状态200,并对options请求做出响应。

    我查过密码里没有我 force_authentication(... ,和 self.client.credentials.__dict__) 返回一个空白字典。

    为什么django在 permission_classes = (permissions.IsAuthenticated,)

    from rest_framework import permissions
    class getUserOptions(views.APIView, ReturnMetadata):
        permission_classes = (permissions.IsAuthenticated,)
        def options(self, request):
            field_meta = self.user_metadata(request)
            return Response(field_meta)
    

    from django.contrib.auth import get_user_model
    from rest_framework import status
    from rest_framework.test import APIClient
    from rest_framework.authtoken.models import Token
    
    class basic_functionality(APITestCase, TestCase):
    
        def setUp(self):
            self.user_details = {...}
            self.client = APIClient()
            self.user_model = get_user_model()
    
            user = self.user_model.objects.create(username=self.user_details['username'])
            user.set_password(self.user_details['password'])
    
            user.first_name = self.user_details['first_name']
            user.last_name = self.user_details['last_name']
            user.email = self.user_details['email']
            ...
            user.is_active = self.user_details['is_active']
            user.save()
    
            self.client.force_login(user)
    
            user_temp = self.user_model.objects.get(username=self.user_details['username'])
            self.user_token = Token.objects.get_or_create(user=user_temp)[0]
    
    class user_options(basic_functionality):
    
        def request_user_options(self, payload):
            """
            Test getting options for the user form
            called by test_user_options
            payload: 
                - Authorization : token
            """
            url = reverse('user_options')
            headers = {'Content-Type': 'multipart/form-data'}
            response = self.client.options(url, data=payload, headers=headers)
    
            return response
    
        def test_user_options_bad_token(self):
            payload = {}
            response = self.request_user_options(payload)
            self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Preston    7 年前

    看来 force_login 给你一个疗程 APIClient ,这意味着您不必验证后续请求。这不是我个人想要实现的,因为这不是使用我的身份验证设置的用户所需要的体验。

    self.client.force_authenticate(user=None)

    docs

    登录: login方法的功能与Django的常规客户端完全相同 班级。这允许您针对任何包含SessionAuthentication的视图对请求进行身份验证。

    # Make all requests in the context of a logged in session.
    client = APIClient()
    client.login(username='lauren', password='secret')
    

    要取消后续请求的身份验证,请调用force\u authenticate 将用户和/或令牌设置为无。

    client.force_authenticate(user=None)