2014-12-07 7 views
7

Próbowałem dodać uwierzytelnianie do mojego interfejsu API Rest przy użyciu OAuth Toolkit. Dostaję się na stronę logowania i wprowadzam moją nazwę użytkownika i hasło, a następnie przekierowuję do mojego api. Dostaję wtedy wiadomość {"szczegóły": "Nie podano danych uwierzytelniających."} Próbowałem zajrzeć do tego i większość ludzi, którzy mają problem, najwyraźniej przegapiła coś z ustawień Rest_Framework. Nie sądzę, żebym miał.Django Rest Framework {"detail": "Poświadczenia uwierzytelniające nie zostały dostarczone."}

Herezje mój kod:

Settings.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 
+0

zrobić jedno z tych rozwiązań pomocy: http://stackoverflow.com/questions/14877249/ – Fiver

+1

Spojrzałem na te i nadal nie ma szczęścia. Jedyną rzeczą, z której nie próbowałem, było "WSGIPassAuthorization On", co do mojego zrozumienia, że ​​jeśli działasz na serwerze Apache, kiedy ja właśnie uruchamiam virtualenv. Jeśli się mylę, nie wiem, gdzie umieścić "WSGIPassAuthorization On" –

+1

Masz rację, to jest opcja konfiguracji specyficznej dla Apache. Czy masz listę 'oauth2_provider' w' INSTALLED_APPS' w swoim pliku ustawień? – Fiver

Odpowiedz

-1

W moim przypadku użyłem klasy permissions.IsAuthenticatedOrReadOnly uprawnień w moim viewset, ale wysłanie żądania POST bez logowania:

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() 

Zatem uprawnienie sprawdzanie ta klasa uprawnień nie powiodła się.

Wszystko idzie dobrze po usunięciu klasy uprawnień IsAuthenticatedOrReadOnly.

5

zobaczyć ur setting.py, jeśli u mieć

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

w REST_FRAMEWORK jak to będzie Uwierzytelnianie za każdym razem kiedy piszesz.

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

, więc go usunąć.

Powiązane problemy