2015-07-07 3 views
5

Ich habe eine Ajax-GET-Anfrage Ich feuere in einem Abschnitt des Knockout-Codes, wo ich sicherstellen muss, dass der Authorization-Header gesetzt ist.Was ist der richtige Weg, um einen Autorisierungsheader an eine Ajax-Anfrage anzuhängen?

Meine Präferenz ist in der Regel mit den jQuery Stenografie Methoden zu gehen wie so:

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

Das ist gut auf seinem eigenen ohne Auth Anforderung, aber wenn ich den Inhaber Token enthalten müssen, ich habe versucht, die mehr langatmig Weg:

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'); }); 

auch nur zu versuchen, das Problem durch den $ .ajaxSend() -Methode keine Ergebnisse liefert nicht zu erzwingen.

$(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); 
    } 
}); 

Also was übersehe ich? Ich überprüfe jede Anfrage in Fiddler und der Auth-Header wird nie angehängt. Es gibt offensichtlich einen richtigen Weg, aber ich vermisse einen Schritt irgendwo. Jede Hilfe wird geschätzt.

+0

Sind Sie sicher, dass die 'sessionStorage.getItem' korrekt Ihr Token zurückgibt? – nemesv

+0

Ja. Ich habe es im Debugger und im Code überprüft. –

Antwort

3

Ich verwende die folgenden:

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(); 
} 

Sie es so viele zusätzliche Header hinzufügen können, dass Sie möchten, ignorieren Sie die cfg. Sachen, aber das ist in einem Netzwerk-Datei, wie in write once, verwenden every mit
getListData('/api/Name/Endpoint').then(function(r){ '// do something});

diese dann löst alle Probleme mit mit etc wiederholen und wirkt wie ein Zauber. meine API gibt das gleiche Modell zurück für jede Art von Ergebnissen

+0

Ja. Das funktioniert. Scheint, dass die Header direkt im Ajax-Aufruf angefügt werden müssen und nicht in einem Event-Handler, der auf Ajax-Start-Events ausgelöst wird. –