从 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})
在 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})