2013-06-04 12 views
5

Ho scritto il seguente controller per testare HTTP Basic Auth utilizzando Angular JS.Impossibile impostare un'intestazione di autenticazione di base HTTP in AngularJS

function TestCtrl($scope, $http, Base64){ 
    $http.defaults.headers.common.Authorization = 'Basic ' + Base64.encode('admin:secret'); 
    $http.jsonp('http://localhost:5000/test'+'/?callback=JSON_CALLBACK', {query:{isArray:true }}). 
    then(function (response) { 
     $scope.test = response.data; 
    }); 
} 

posso vedere l'intestazione essendo impostato quando i console.log($http.defaults.headers). Ma quando controllo le intestazioni delle richieste utilizzando Chrome Developer Toolbar o Firebug in Firefox, non vedo l'intestazione Authorization.

Il server che riceve la richiesta non ottiene l'intestazione Autorizzazione.

Cosa sto facendo di sbagliato qui?

+1

Non è possibile personalizzare le intestazioni con JSONP. Vedi http://stackoverflow.com/questions/3073287/set-headers-with-jquery-ajax-and-jsonp –

+0

Grazie .. Indovina che dovrei usare get o post allora. – Manu

risposta

4

Credo che la risposta sia "Sì, per le richieste regolari di AJAX dovresti essere in grado di impostare le corrette intestazioni di autenticazione".

Tuttavia, non si sta effettuando una chiamata XHR standard quando si utilizza JSONP (in base all'esempio), , che modifica la risposta su "No".

Se sei bloccato utilizzando JSONP, non penso che tu possa inviare alcun header auth. Ad esempio, JSONP non funziona allo stesso modo di Angular's $http.get.

Vedere http://schock.net/articles/2013/02/05/how-jsonp-really-works-examples/ per i dettagli, ma la versione breve è JSONP inserisce un tag <script> che recupera alcuni dati. I dati restituiti chiamano la funzione fornita dall'utente (JSON_CALLBACK nell'esempio) attorno ai dati forniti dal server. Per questo motivo, non è possibile modificare le intestazioni: la richiesta è una richiesta GET HTTP esattamente come se avessi incollato l'URL per il tag dello script nella barra dell'indirizzo del browser.

1

JJ ha risposto perfettamente.

Per ulteriori informazioni per coloro che navigano, se hai solo bisogno di passare l'intestazione di autorizzazione di base, puoi semplicemente inserire un nome utente e una password all'inizio dell'URL. Questo invierà l'intestazione.

Ad esempio, utilizzando localhost come URL e admin: segreto come il nome utente: Password, il cambiamento:

http://localhost:5000 

a:

http://admin:[email protected]:5000 

Nota: @OliBlogger ha sottolineato che l'ultima versione di Chrome non supporta più questa funzione. Controlla il suo commento per un link all'effettivo aggiornamento dello stato di Chrome.

+0

perché il voto negativo? – eclipse1121

+0

Provato questo nella barra degli indirizzi del browser, ma ha dato solo un errore. Questa potrebbe essere una caratteristica della libreria JS? Forse il downvote è stato per mancanza di dettagli e probabilmente non è una buona pratica, ma è una caratteristica interessante da conoscere. – user1944491

+0

grazie per il commento. ecco [un esempio] (http://i.imgur.com/l0os1pJ.png) di come potresti farlo usando l'API Stripe, che usa l'autenticazione di base. ciò che può essere richiesto è che l'URL richiesto deve restituire l'intestazione di base dell'autorizzazione e l'intestazione 401 non autorizzata, ma non sono sicuro che sia – eclipse1121

Problemi correlati