Django Rest Framework{“detail”:“未提供身份验证凭据。”}

2024-03-28 05:38:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用OAuth工具包向Rest API添加身份验证。我进入登录页面,输入用户名和密码,然后重定向到我的api。然后我收到一条消息{“detail”:“未提供身份验证凭据。”}我已经尝试过对此进行调查,大多数遇到此问题的人似乎都错过了其他框架设置中的一些内容。我想我没有。

这是我的代码:

设置.py

LOGIN_REDIRECT_URL = '/api/users/'

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    ),
}

网址.py

urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)),
                       url(r'^accounts/login/$', auth_views.login, {'template_name': 'login.html'}),

                       url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
                       url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
                       url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),

                       url(r'^api/users/$', api.UserList.as_view()),
                       url(r'^api/users/(?P<pk>[0-9+]+)/$', api.UserDetail.as_view()),
                       )

api.py标准

@receiver(post_save, sender=User)
def init_new_user(sender, instance, signal, created, **kwargs):
    if created:
        Token.objects.create(user=instance)


class APIEndpoint(ProtectedResourceView):
    def get(self, request, *args, **kwargs):
        return HttpResponse('Protected with OAuth2!')


class UserViewSet(viewsets.ModelViewSet):
    model = User
    serializer_class = UserSerializer

    def retrieve(self, request, pk=None):
        if pk == 'me':
            return Response(UserSerializer(request.user).data)
        return super(UserViewSet, self).retrieve(request, pk)


class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

Tags: pyauthrestapidefaulturlrequestframework
3条回答

查看您的settings.py(如果有)

'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
),

在这样的REST_框架中,每次发布时它都会进行身份验证。

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

所以,删除它。

在我的例子中,令牌身份验证在开发服务器上运行良好,而不是在Apache上。原因正是缺少WSGIPassAuthorization On

http://www.django-rest-framework.org/api-guide/authentication/#apache-mod_wsgi-specific-configuration

在我的例子中,我在viewset中使用了一个permissions.IsAuthenticatedOrReadOnly权限类,但是在不登录的情况下发送post请求:

class MemberViewSet(viewsets.ModelViewSet):

    queryset = Member.objects.all()
    serializer_class = MemberSerializer

    permission_classes = (
        permissions.IsAuthenticatedOrReadOnly,
    )

    @list_route(methods=['post'])
    def check_activation_code(self, request):
        # my custom action which do not need login
        # I met the error in this action
        do_something()

因此,该权限类的权限检查失败。

删除IsAuthenticatedOrReadOnly权限类之后,一切都顺利。

相关问题 更多 >