Когда я использую $ resource для входа REST, transformRequest не добавляет заголовок авторизации, как предполагалось. Используя вызов $.ajax, он работает по назначению. Таким образом, используя:
$scope.login2 = function() {
function setHeader(xhr){xhr.setRequestHeader("Authorization", "Basic " + btoa($scope.gebruikersnaam + ':' + $scope.wachtwoord))}
$.ajax({type: "POST", url: "http://localhost:8000/authview/", beforeSend: setHeader}).
fail(function(resp){
console.log('bad credentials.')
}).
done(function(resp){
console.log('welcome ' + resp.email)
})
}
Я получаю заголовок авторизации, добавленный в запрос:
Origin: http://localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36
Authorization: Basic YWRtaW46cGFzc3dvcmQ=
Но когда делаете:
$scope.login = function() {
api.auth.login($scope.getCredentials()).
$promise.
then(function(data){
// on good username and password
$scope.gebruikersnaam = data.username;
}).
catch(function(data){
// on incorrect username and password
alert(data.data.detail);
});
};
где "api.auth.login" определяется как:
kmregistratieApp.factory('api', function($resource){
function add_auth_header(data, headersGetter){
var headers = headersGetter();
headers['Authorization'] = ('Basic ' + btoa(data.username + ':' + data.password));
}
return {
auth: $resource('http://localhost:8000/authview/', {}, {
login: {method: 'POST', transformRequest: add_auth_header},
logout: {method: 'DELETE'}
}),
users: $resource('http://localhost:8000/authview/', {}, {
create: {method: 'POST'}
})
};
});
После "заголовков ['Authorization'] = ('Basic' +..." (при отладке) я вижу, что он сидит в headersGetter:
headers: Object
Authorization: "Basic YWRtaW46cGFzc3dvcmQ="
accept: "application/json, text/plain, */*"
content-type: "application/json;charset=utf-8"
Но он не появляется на вкладке "Сеть" при проверке заголовков. Поэтому мой вопрос заключается в том, почему не работает ресурс $ resource, не добавляющий заголовок авторизации?
TransformRequest не предназначен для изменения заголовков. См. Журнал изменений в AngularJS. Прокрутите немного вниз, и вы увидите следующее:
Функции transformRequest больше не могут изменять заголовки запросов.
Заголовки HTTP могут быть указаны только при использовании $ http. Пример:
$http.post('/someUrl', data, { headers: { 'Authorization': 'Basic'+key } });