我正在为 Drupal 7 网站构建新的 AngularJS 前端。这是使用带有基于会话的身份验证的服务模块,跨两个使用 CORS 的域。我能够使用 Drupal 进行身份验证,检索用户对象和会话数据,然后从服务模块获取 CSRF 令牌。我遇到的问题是在标头中设置所有这些,以便对后续请求进行身份验证。我了解整体概念,但对 AngularJS 和防止 CSRF 攻击都是新手。
根据我收集到的关于 AngularJS 和 RubyOnRails 设置的信息,平台之间在令牌命名和处理方式方面可能存在不一致。似乎还有一些关于如何在标题中设置此标记的建议。但是,我很难找到一个可靠的例子来说明如何让这些平台说同一种语言。
我在 app.js 中对 $httpProvider 所做的唯一事情是:
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 = 'http://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 = 'http://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');
}
});
};