2015-07-07 23 views
5

Mam żądanie ajax GET odpalam w sekcji Knockout kodu, gdzie muszę zapewnić nagłówek Authorization jest ustawiony.Jaki jest poprawny sposób dołączania nagłówka autoryzacji do żądania Ajax?

Moje preferencje to zwykle iść z metod skrót jQuery tak:

$.getJSON("/api/business", function (allData) { 
    var mappedOrgs = $.map(allData, function (item) { return new Business(item) }); 
    self.businesses(mappedOrgs); 
}); 

to jest w porządku na własną rękę, bez wymogu auth ale jeśli muszę to okaziciela token Próbowałam tym bardziej rozwlekły sposób:

var token = sessionStorage.getItem(tokenKey); 
var headers = {}; 
if (token) { 
    headers.Authorization = 'Bearer ' + token; 
} 

$.ajax({ 
    type: 'GET', 
    url: '/api/business', 
    headers: headers 
}).done(function (data) { 
    var mappedOrgs = $.map(data, function (item) { return new Business(item) }); 
    self.businesses(mappedOrgs); 
}).fail(function() { console.error('api call failed'); }); 

Nawet starając się zmusić ten problem poprzez $ .ajaxSend() metoda nie przynosi żadnych rezultatów.

$(document).ajaxSend(function (event, xhr, settings) { 
    var token = sessionStorage.getItem(tokenKey); 
    var headers = {}; 
    if (token) { 
     console.info("Found token. Attaching to headers."); 
     headers.Authorization = 'Bearer ' + token; 
     settings.headers = headers; 
     //console.info(headers); 
    } 
}); 

Co więc mam z widokiem? Sprawdzam każde żądanie w Skrzypku, a nagłówek Auth nigdy nie jest dołączony. Jest oczywiście dobry sposób, aby to zrobić, ale gdzieś brakuje jakiegoś kroku. Każda pomoc doceniona.

+0

Czy jesteś pewien, że 'sessionStorage.getItem' poprawnie zwraca token? – nemesv

+0

Tak. Sprawdziłem to w debugerze i kodzie. –

Odpowiedz

3

używam następujące:

function getListData(url) { 
    var d = new $.Deferred(); 
    cfg.apiLoad(); 

    $.ajax({ 
     url: baseUrl + url, 
     type: 'GET', 
     headers: { "x-access-token": secure.getToken(), "x-access-finger": finger.getFinger() }, 
     dataType: 'json' 
    }).fail(function(a, b, c) { 
     cfg.failError(c); 
     d.reject(c); 
    }).done(function (r) { 
     cfg.apiDone(r); 
     d.resolve(r.ListResults); 
    }); 

    return d.promise(); 
} 

można dodać dowolną liczbę dodatkowych nagłówków tam, że chcesz, ignorować cfg. rzeczy, ale to jest w pliku sieciowego, jak w zapisie raz, użyj everywere z
getListData('/api/Name/Endpoint').then(function(r){ '// do something});

ten następnie rozwiązuje wszelkie problemy z konieczności powtarzania itp i działa jak czar. Mój interfejs API zwraca ten sam model dla każdego typu wyników.

+0

Tak. To działa. Wygląda na to, że nagłówki muszą być dołączone bezpośrednio w wywołaniu Ajax, a nie w ramach programu obsługi zdarzeń, który uruchamia zdarzenia startowe ajax. –