权限类 IsAuthenticated 在 DRF 中不起作用

问题描述 投票:0回答:2

我使用了令牌身份验证,它工作正常,即它正在对用户进行身份验证,然后用户登录。但在我看来,我已将其中一个视图的权限类设置为 IsAuthenticated,并且不允许用户,即使他是经过身份验证的用户。 下面是屏幕截图,显示我已登录([电子邮件受保护]):

enter image description here

下一个选项卡显示“未提供身份验证凭据。”:

enter image description here

有人能告诉我出了什么问题吗? 好的,我提供详细信息: 这些是我的设置:

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

这就是我的身份验证方式:

class UserLoginAPIView(APIView):

    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        data = request.data
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            # new_data = serializer.data
            if serializer.data:
                user = authenticate(username=request.data['username'], password=request.data['password'])
                login(request, user)
                print("IsAuthenticated", user.is_authenticated)
            token, _ = Token.objects.get_or_create(user=user)
            return Response({'token': token.key},
                            status=HTTP_200_OK)

我设置限制的另一个视图:

class BoardCreateAPIView(CreateAPIView):
    queryset = Boards.objects.all()
    serializer_class = BoardCreateSerializer
    permission_classes = (IsAuthenticated,)
python django-rest-framework django-serializer django-authentication auth-token
2个回答
2
投票

正如@Reza 暗示的那样,您错过了令牌身份验证的要点。您正在尝试改用基本身份验证流程。流程是这样的:

  1. 客户端使用登录名和密码从服务器请求令牌
  2. 服务器验证您的凭据是否正确,创建令牌并将其返回给客户端
  3. 在后续请求中,客户端将令牌添加到 Auth 标头中,如下所示:

    Authorization: Token <the_client_token>

因此,您应该在登录视图中执行的操作是验证用户凭据并创建令牌。您不应该尝试自己执行身份验证。您可以将视图重命名为

obtain_token
,以免混淆其功能。

查看链接的文章@Reza 以获取更多信息。


1
投票

在 django Rest 框架中,您应该在请求标头中提供令牌。这是带有curl命令的示例:

curl -X POST -H "Content-Type: application/json" -H "Authorization: Token <MY_TOKEN>" http://my-api-url

还要检查您的

settings.py
中至少有这些行:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
)
}

为了更多的理解阅读这个来自djangorest框架的文档

© www.soinside.com 2019 - 2024. All rights reserved.