【问题标题】:Django Rest Framework {"detail":"Authentication credentials were not provided."}Django Rest Framework {"detail":"未提供身份验证凭据。"}
【发布时间】:2015-02-05 06:04:38
【问题描述】:

我尝试使用 OAuth Toolkit 向我的 Rest API 添加身份验证。我进入登录页面并输入我的用户名和密码,然后重定向到我的 api。然后我收到一条消息 {"detail":"Authentication credentials were not provided."} 我已经尝试对此进行调查,大多数有问题的人似乎都错过了 Rest_Framework 设置中的某些内容。不过我想我没有。

这是我的代码:

设置.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',
    ),
}

url.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

【问题讨论】:

  • 对这些解决方案有帮助:stackoverflow.com/questions/14877249
  • 我看了这些,但仍然没有运气。从那里我唯一没有尝试的是WSGIPassAuthorization On,据我所知,如果你在Apache服务器上运行,而我只是运行virtualenv。如果我错了,我不知道在哪里放 WSGIPassAuthorization On
  • 你是对的,这是一个 Apache 特定的配置选项。您的设置文件中的INSTALLED_APPS 中有oauth2_provider 列表吗?
  • 嗯,我唯一能想到的另一件事就是尝试切换DEFAULT_AUTHENTICATION_CLASSES的顺序,让OAuth2在前。
  • 你得到的响应码是什么?

标签: python django rest django-rest-framework


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在我的例子中,我在视图集中使用了permissions.IsAuthenticatedOrReadOnly 权限类,但是在没有登录的情况下发送了一个发布请求:

    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 权限类后一切正常。

    【讨论】:

      【解决方案3】:

      如果你有,请查看你的 settings.py

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

      像这样在REST_FRAMEWORK中,每次发帖都会验证。

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

      所以,删除它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 2015-05-16
        • 2019-04-29
        • 2015-01-10
        • 2018-02-25
        • 2019-02-19
        • 2021-06-15
        • 2022-11-10
        相关资源
        最近更新 更多