2014-12-07 12 views
7

Ho provato ad aggiungere l'autenticazione alla mia API Rest utilizzando OAuth Toolkit. Raggiungo la pagina di accesso e inserisco il mio nome utente e la password, quindi reindirizzato alla mia API. Poi ho ricevuto un messaggio {"detail": "Le credenziali di autenticazione non sono state fornite."} Ho provato a esaminare questa e la maggior parte delle persone che hanno il problema sembrano aver perso qualcosa dalle impostazioni di Rest_Framework. Non penso di avere però.Django Rest Framework {"detail": "Le credenziali di autenticazione non sono state fornite."}

Heres il mio codice:

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

fare una di queste soluzioni aiuto: http://stackoverflow.com/questions/14877249/ – Fiver

+1

Ho guardato quelli e ancora senza fortuna. L'unica cosa da cui non provavo era il 'WSGIPassAuthorization On' per quanto ne so, se si esegue su un server Apache quando sto semplicemente eseguendo solo virtualenv. Se ho torto, non so dove mettere il 'WSGIPassAuthorization On' –

+1

Hai ragione, questa è un'opzione di configurazione specifica di Apache. Avete l'elenco di 'oauth2_provider' in' INSTALLED_APPS' nel file delle impostazioni? – Fiver

risposta

-1

Nel mio caso, ho usato una classe permissions.IsAuthenticatedOrReadOnly il permesso a mio viewset, ma l'invio di una richiesta post senza login:

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

Così il permesso il controllo di quella classe di permesso è fallita.

Tutto va bene dopo aver rimosso la classe di autorizzazione IsAuthenticatedOrReadOnly.

5

vedere ur setting.py, se u avere

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

in REST_FRAMEWORK come questo, autenticherà ogni volta che si posta.

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

quindi, cancellarlo.

Problemi correlati