2014-12-07 13 views
7

Tôi đã cố thêm xác thực vào API Rest của mình bằng Bộ công cụ OAuth. Tôi đến trang đăng nhập và nhập tên người dùng và mật khẩu của mình rồi chuyển hướng đến api của tôi. Sau đó tôi nhận được thông báo {"chi tiết": "Thông tin đăng nhập xác thực không được cung cấp."} Tôi đã thử xem xét điều này và hầu hết những người có vấn đề dường như đã bỏ sót thứ gì đó trong cài đặt Rest_Framework. Tôi không nghĩ rằng tôi có mặc dù.Django Rest Framework {"detail": "Chứng thực xác thực không được cung cấp."}

Heres mã của tôi:

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

làm bất kỳ giải pháp nào trong số này giúp ích: http://stackoverflow.com/questions/14877249/ – Fiver

+1

Tôi đã xem xét những điều đó và vẫn không có may mắn. Điều duy nhất từ ​​đó tôi đã không cố gắng là 'WSGIPassAuthorization On' như sự hiểu biết của tôi thats nếu bạn đang chạy trên một máy chủ Apache khi tôi chỉ chạy virtualenv. Nếu tôi sai, tôi không biết nơi để đặt 'WSGIPassAuthorization On' –

+1

Bạn đúng, đó là tùy chọn cấu hình Apache cụ thể. Bạn có danh sách 'oauth2_provider' trong' INSTALLED_APPS' trong tệp cài đặt của mình không? – Fiver

Trả lời

-1

Trong trường hợp của tôi, tôi đã sử dụng một lớp permissions.IsAuthenticatedOrReadOnly phép trong viewset của tôi, nhưng gửi một yêu cầu bài mà không cần đăng nhập:

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

Vì vậy, các phép kiểm tra lớp quyền đó không thành công.

Mọi thứ diễn ra tốt đẹp sau khi tôi xóa lớp cấp phép IsAuthenticatedOrReadOnly.

5

thấy ur setting.py, nếu u có

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

trong REST_FRAMEWORK như thế này, nó sẽ Authenticate mỗi lần khi bạn đăng bài.

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

vì vậy, hãy xóa.

Các vấn đề liên quan