0

Я пытаюсь сделать очень простую форму входа, используя angular.js на передней панели и апи-отдыхе на заднем конце. Вот форма на HTML стороне:403 ошибка с сообщением angular.js и рамки django rest

<form action="" method="post"> 
    {% csrf_token %} 
    <div class="modal-body"> 
     <div class="form-group"> 
      <label for="login-username" class="control-label">Email:</label> 
      <input type="text" class="form-control" name="username" id="login-username" ng-model="loginData.email" required> 
     </div> 
     <div class="form-group"> 
      <label for="login-password" class="control-label">Password:</label> 
      <input type="text" class="form-control" name="password" id="login-password" ng-model="loginData.password" required> 
     </div> 
    </div> 
    <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     <button type="button" class="btn btn-primary" ng-click="login()">Login as {$ loginData.email $}</button> 
    </div> 
</form> 

А вот мой угловой контроллер (NB: Я знаю, что это не проблема здесь, потому что у меня есть очень похожий один для функции регистра, который работает просто отлично):

mainApp.controller("mainCtrl", function($scope, $http) { 
    $scope.loginData = {"email":"[email protected]","password":"pass"}; 
    $scope.login = function() { 
     return $http.post('/api/v1/auth/login/', 
      $scope.loginData 
     ).success(function(data, status){ 
      alert("success : "+status); 
      console.log(data); 
     }).error(function(data, status){ 
      alert("error : "+status); 
     }); 
    } 
}); 

и вот мое угловое приложение, которое включает заголовки CSRF:

var mainApp = angular.module("mainApp", []).config(function($interpolateProvider) { 
    $interpolateProvider.startSymbol('{$'); 
    $interpolateProvider.endSymbol('$}'); 
}).run(run); 


function run($http) { 
    $http.defaults.xsrfHeaderName = 'X-CSRFToken'; 
    $http.defaults.xsrfCookieName = 'csrftoken'; 
} 

на стороне Джанго, у меня есть вид входа, который прекрасно работает для ГЭТ, а не для метода пост. И вот где я потерялся.

class LoginView(views.APIView): 
    """ 
    View for login user 
    """ 
    queryset = BaseUser.objects.all() 

    def get(self, request, format=None): 
     print("get_login098765") # THIS IS PRINTED PERFECTLY 
     return Response() 

    def post(self, request, format=None): #THIS THROWS 403 ERROR 
     print("post_login098765") #THIS IS NOT PRINTED 
     return Response() 

Что мне не хватает? Благодаря !

EDIT:

Я получаю файл с именем Войти содержащий: {"detail":"Authentication credentials were not provided."}

+1

Вам нужно отправить токен csrf в заголовки. –

+0

Проверьте мои изменения. Спасибо –

+1

Вы видите токен csrf в заголовках полезной нагрузки запроса? Вы можете проверить инструменты разработчика. –

ответ

1

В ответ на ваше редактирование, сообщение: {"detail":"Authentication credentials were not provided."} подбрасывается Django REST Framework и относится к вашим разрешениям на этот ViewSet. Я рекомендовал бы взглянуть на http://www.django-rest-framework.org/api-guide/authentication/

Это может состоять из добавления классов аутентификации по умолчанию в файле настроек, например так:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

или представления, например, так:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication 
from rest_framework.permissions import IsAuthenticated 

class LoginView(api.APIView): 
    authentication_classes = (SessionAuthentication, BasicAuthentication) 
    permission_classes = (IsAuthenticated,) 
    [...] 

UPDATE : Поскольку с разрешения AllowAny в качестве разрешенных разрешений вы можете сделать следующее, чтобы ограничить эти разрешения почтовым маршрутом. Вот пример:

class LoginView(api.APIView): 
    queryset = BaseUser.objects.all() 

    def get_permissions(self): 
     if self.request.method == 'POST': 
      return (permissions.AllowAny(),) 

     return (permissions.IsAuthenticated(),) 

Это аннулирует разрешения для запросов POST на этой конечной точке, и по умолчанию в IsAuthenticated для других маршрутов.

+0

Спасибо @ZackTanner. Я уверен, что проблемы вокруг этих проблем. Но, к сожалению, то, что вы предоставили, еще не решает проблему. –

+0

Попробуйте установить allow_classes на 'AllowAny'. Сначала импортируйте это разрешение, 'из rest_framework.permissions импортируйте AllowAny', затем обновите allow_classes, чтобы быть' permission_classes = (AllowAny,) ' –

+0

он сработал! Большое спасибо ! Но разве не опасно иметь AllowAny, и почему он не работает для IsAuthenticated? Благодаря ! –

2

Из того, что я прочитал, параметры CRSF должны быть применены в функции конфигурации:

var mainApp = angular.module("mainApp", []).config(function($interpolateProvider, $httpProvider) { 
    $interpolateProvider.startSymbol('{$'); 
    $interpolateProvider.endSymbol('$}'); 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
}).run(run); 
+0

и что конфигурация прикреплена к' $ httpProvider', а не '$ http' – oliverpool

+0

Это не помогает, и {$ больше не интерпретируются. –

Смежные вопросы