从 Angular JS 发布到 sails 后端时 CSRF 不匹配

CSRF mismatch when POSTing to sails backend from Angular JS

在 angular 中,我获得了这样的 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 调用中收到的字段相同。

但我收到了回复 'CSRF mismatch'。然而,当我用 Postman 尝试完全相同的事情时,它工作正常(所以我认为这不是 sails 服务器的问题)。

这是angular中的登录代码。在控制器中:

$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);
}

您发布了完整的请求,答案隐藏在那里,一目了然——不是通过查看发送的内容,而是通过查看省略的内容:即曲奇饼。 CSRF 令牌对单个 Sails 会话有效,但您忽略了随 AJAX 请求发送 cookie,因此 Sails 不知道您发送的 CSRF 令牌是针对哪个会话的。

要告诉 Angular 在您的请求中发送 cookie,请使用 withCredentials 设置:

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