DRF-令牌认证与常规认证一起

时间:2019-12-18 10:44:50

标签: python django rest django-rest-framework django-authentication

我有一个内部API,其中所有ViewSet都具有LoginRequiredMixin,因为该API仅由登录用户使用。

现在我有时需要通过auth_token使它可用-例如。当用户未登录但具有令牌时。

我添加了TokenAuthentication

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',
                                'rest_framework.filters.OrderingFilter'],

    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',


    ],
}

并尝试使用Authorization标头:Token <MYTOKEN>访问API,但是它将所有请求重定向到登录。

如何使其起作用,以便必须对用户进行身份验证或使用授权标头?

这是ViewSet

class OrderViewSet(LoginRequiredMixin, ModelViewSet):
    serializer_class = OrderSerializer
    filterset_class = OrderFilter

2 个答案:

答案 0 :(得分:2)

关于这个问题,我为您提供2种解决方案

1。删除LoginRequiredMixin,因为LoginRequiredMixin用于django View身份验证,而不用于django rest框架视图(*身份验证)

class OrderViewSet(ModelViewSet):
    serializer_class = OrderSerializer
    filterset_class = OrderFilter

然后在setting.py文件上添加默认的permissionauthenticationREST_FRAMEWORK,如下所示

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',
                            'rest_framework.filters.OrderingFilter'],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

2。如果要在类视图上设置permissionauthentication添加,则不必设置setting.py文件。试试这个

from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication, SessionAuthentication

class OrderViewSet(ModelViewSet):
    permission_classes = (IsAuthenticated, )
    authentication_classes = (SessionAuthentication, TokenAuthentication, )
    serializer_class = OrderSerializer
    filterset_class = OrderFilter

答案 1 :(得分:0)

您必须在INSTALLED_APPS设置中包含“ rest_framework.authtoken”。


请参阅此处 TokenAuthentication