Я занимаюсь созданием нового интерфейса AngularJS для веб-сайта Drupal 7. Это использует модуль Services с аутентификацией на основе сеанса в двух доменах с использованием CORS. Я могу пройти аутентификацию с помощью Drupal, получить пользовательский объект и данные сеанса, а затем получить токен CSRF из модуля служб. У меня проблемы с настройкой всего этого в заголовке, чтобы последующие запросы аутентифицировались. Я понимаю общую концепцию, но новичок как в AngularJS, так и в предотвращении атак CSRF.
Из того, что я узнал об этой настройке с AngularJS и RubyOnRails, между платформами могут быть несоответствия в отношении того, как называется токен и как он обрабатывается. Также кажется, что есть ряд предложений о том, как установить этот токен в заголовке. Однако у меня возникли проблемы с поиском надежного примера того, как заставить эти платформы говорить на одном языке.
Единственное, что я делаю с моим $httpProvider в app.js, это:
delete $httpProvider.defaults.headers.common['X-Requested-With'];
Контроллер входа в controller.js:
.controller('LoginCtrl', ['$scope', '$http', '$cookies', 'SessionService', function($scope, $http, $cookies, SessionService) {
$scope.login = function(user) {
//set login url and variables
var url = 'https://mywebsite.com/service/default/user/login.json';
var postDataString = 'name=' + encodeURIComponent(user.username) + '&pass=' + encodeURIComponent(user.password);
$http({
method: 'POST',
url: url,
data : postDataString,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function (data, status, headers, config) {
var sessId = data.sessid;
var sessName = data.session_name;
$cookies[sessName] = sessId;
var xsrfUrl = 'https://mywebsite.com/services/session/token';
$http({
method: 'GET',
url: xsrfUrl
}).success(function (data, status, headers, config) {
$cookies["XSRF-TOKEN"] = data;
SessionService.setUserAuthenticated(true);
}).error(function (data, status, headers, config) {
console.log('error loading xsrf/csrf');
});
}).error(function (data, status, headers, config) {
if(data) {
console.log(data);
var msgText = data.join("\n");
alert(msgText);
} else {
alert('Unable to login');
}
});
};