Запрещена (403) проверка CSRF.Запрос отменен.Django + AngularJS - PullRequest
0 голосов
/ 25 мая 2018

Я использую проект Django v1.10.8.У меня есть форма, которая обрабатывается с AngularJS v1.5.6.Я поместил проект на удаленный сервер, который использует SSL и работает по протоколу HTTPS.

Когда я пытаюсь отправить свою пользовательскую форму входа, я получаю эту ошибку: Forbidden (403) CSRF verification failed. Request aborted..

login_register.html Форма входа здесь:

<div ng-app="app" ng-controller="Ctrl">
<form method="post" name="loginForm" ng-submit="login()">
    <fieldset ng-disabled="submittingForm">
        <p>
            <input 
                id="{{ login_form.username.id_for_label }}"
                type="email" 
                name="{{ login_form.username.html_name }}"
                placeholder="Email"
                ng-model="login.email"
                required>
        </p>
        <p>
                <input 
                    class="form-control" 
                    id="{{ login_form.password.id_for_label }}" 
                    name="{{ login_form.password.html_name }}"
                    placeholder="{% trans 'Password (8+ characters)' %}"
                    type="[[[ login.showPW ? 'text' : 'password' ]]]" 
                    ng-minlength="{{ min_pw_length }}" 
                    ng-maxlength="{{ max_pw_length }}" 
                    ng-model="login.pw"
                    required 
                >               
        </p>
        <button class="btn btn-primary" type="submit" ng-disabled="!login.email || !login.pw">{% trans "Log in" %}</button>
    </fieldset>
</form>
</div>

login-register.js:

var app=    angular.module("app",[]);
app.config(function($interpolateProvider, $httpProvider){
    $interpolateProvider.startSymbol("[[[");
    $interpolateProvider.endSymbol("]]]");

    $httpProvider.defaults.xsrfCookieName=  "csrftoken";
    $httpProvider.defaults.xsrfHeaderName=  "X-CSRFToken";
});

app.controller("Ctrl", function($scope, $http, $window){
    $scope.loginError=  '';

    $scope.login= function(){
        $scope.submittingForm=  true;
        $scope.loginError=  '';
        var formData=   {
            "username": $scope.login.email,
            "password": $scope.login.pw
        };
        $http.post(
            "login", 
            JSON.stringify(formData)
        ).success(function(response){
            if (response.success === false){
                $scope.loginError=  response.err_msg;
                $scope.submittingForm=false;
                return;
            }
            $window.location.href=  GLOBAL_paths.home;
        });
    };
});

Вот выдержка моя local_settings.py:

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = "DENY"
SECURE_HSTS_SECONDS = 60
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

Почему я получаю это 403ошибка несмотря на установку токена CSRF в JS?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

После тега формы должен быть CSRF токен

<form method="post" name="loginForm" ng-submit="login()">
{% csrf_token %}
0 голосов
/ 27 мая 2018

Если я не ошибаюсь серьезно, и, поскольку я мало что знаю или нет, это очень возможно, вы фактически никогда не устанавливаете настоящий токен в своем Javascript.Вы создали cookie, но не добавили в него значение токена.Вы можете получить доступ к необработанному значению токена в своем HTML с помощью {{ csrf_token }}.

Если я я неверен, то также существует вероятность того, что вы не используете HTTPS для доступа к странице, что может возникнуть из-за того, что вы установили CSRF_COOKIE_SECURE = True

...