从Angular JS发布后端后,CSRF不匹配

时间:2015-01-23 14:54:59

标签: angularjs sails.js

在角度中,我获得了这样的CSRF令牌:

// Get CSRF token and set as header
var csrfRequest = Auth.getCSRF().then(function(data){
    console.log(data.data._csrf);
    $rootScope.csrf = data.data._csrf;
});

将新令牌记录到控制台(这样可以正常工作)。

然后,我尝试登录sails.js api。这是请求:

POST /auth/login HTTP/1.1
Host: localhost:1337
Connection: keep-alive
Content-Length: 108
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost/sails-front/src/login/
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

Request Payloadview parsed
    {"email":"myemail@email.com","password":"mypass","_csrf":"PIlVO7S362OroPGBSG0X1vW2FydkP9VhK8cMk="}

_csrf字段与getCSRF电话中收到的字段相同。

然而,我得到了回应&CSRFF不匹配'。但是,当我和Postman尝试完全相同的东西时,它工作正常(所以我不认为这是sails服务器的问题)。

这里是角度的登录代码。在控制器中:

$scope.login = function() {
    Auth.login({
            email: $scope.email,
            password: $scope.password,
            _csrf: $rootScope.csrf
        },
        function(res) {
            $state.go('app.home');
        },
        function(err) {
            $rootScope.error = "Failed to login";
        });
};

Auth服务:

/*********************************
* login
******************************** */
function login(user, success, error) {
    $http.post(API_BASE_URL + 'auth/login', user).success(function(user){
        changeUser(user);
        success(user);
    }).error(error);
}

1 个答案:

答案 0 :(得分:2)

您发布了完整的请求,答案隐藏在那里 - 不是通过查看正在发送的内容,而是省略的内容:即Cookie。 CSRF令牌对单个Sails会话有效,但您忽略了使用您的AJAX请求发送cookie,因此Sails不知道您发送的CSRF令牌是哪个会话。

要告知Angular根据您的请求发送Cookie,请使用withCredentials设置:

$http.post(API_BASE_URL + 'auth/login', user, {withCredentials: true})