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

Django绕过权限装饰器进行用户注册,并要求进行身份验证

  •  1
  • dustwig  · 技术社区  · 8 年前

    我正在努力为我的API服务注册用户。我已经检查了方法,一切都是有效的, 但我在发布用户注册数据时仍然收到一个错误代码

    错误代码:

    {"details": "Authentication credentials not provided"}
    

    设置。py公司

    REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
        ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    )
    }
    

    目前唯一有效的方法是为现有用户获取令牌:

    url(r'^auth/', views.obtain_auth_token, name='get_auth_token'),
    

    url(r'^login/', Login.as_view(), name='login'),
    url(r'^register/', Register.as_view(), name='signup'),
    

    我认为我没有使用最佳实践进行用户注册,或者我把登录和注册混淆了。我不确定。

    在视图中注册用户方法。py公司

    # Register User
    
    class Register(APIView):
    
    queryset = User.objects.all()
    serializer_class = UserSerializer
    # permission_classes = [permissions.IsAuthenticated]
    
    @permission_classes([permissions.IsAuthenticated, ])
    @api_view(['POST', ])
    def register_user(self, request, *args, **kwargs):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            self.perform_create(serializer) # serializer.save()
            headers = self.get_success_headers(serializer.data)
            token, created = Token.objects.get_or_create(user=serializer.instance)
            return Response({'token': token.key, 'id': serializer.instance.id}, status=status.HTTP_201_CREATED, headers=headers)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    在视图中登录用户方法。py公司

    queryset = User.objects.all()
    serializer_class = UserSerializer
    
    @api_view(['POST', ])
    def login(request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
    
        if user is not None:
            if user.is_active:
                login(request, user)
                return Response({"success": "User was successfully logged on."},)
            else:
                return Response({"error": "Login failed, bad request."},)
        else:
            return Response({"error": "Login failed, invalid username or password"}, status=status.HTTP_401_UNAUTHORIZED)
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   mindcruzer    8 年前

    您的DRF设置如下: IsAuthenticated 是每个视图的默认权限类之一。您遇到问题的视图是DRF在没有令牌(也不应该)的情况下检查令牌的结果。尝试显式清除这些视图的权限类: @permission_classes([])

    原因 obtain_auth_token https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/views.py#L10