Come inviare un'intestazione di autorizzazione corretta per l'autenticazione di base


100

Sto provando a POST dei dati dalla mia API ma non riesco a superare l'autenticazione di base.

Provo:

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic [REDACTED]');
  }
});

La mia risposta di configurazione del server è:

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

Le intestazioni che ottengo sono:

Richiedi intestazioni

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Intestazione della risposta

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

Immagino che la configurazione del server sia buona perché posso accedere all'API dal client REST avanzato (estensione Chrome)

Eventuali suggerimenti?

PD: L'intestazione che ottengo dal client Advanced REST è:

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic [REDACTED]
    Content-Type: application/x-www-form-urlencoded 
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

e

    Server: nginx/1.1.19 
    Date: Fri, 16 Aug 2013 01:07:18 GMT 
    Content-Type: application/json; charset=utf-8 
    Transfer-Encoding: chunked 
    Connection: keep-alive
    Vary: Accept, Cookie 
    Allow: POST, OPTIONS 
    X-Robots-Tag: noindex

invio del metodo OPTION


19
Mi rendo conto che questo post è morto da tempo, ma voglio solo farti notare nel caso in cui non fossi a conoscenza che pubblicando la tua intestazione Authorization:, hai essenzialmente pubblicato la tua password in chiaro. La stringa di gibberish è solo la codifica base64 del tuo nome utente: password, quindi tutti possono vedere la tua password. Si spera che tu l'abbia capito e abbia usato una password fittizia qui :)
Lexelby

Funziona bene con il server di report SSRS 2017. Nasconde la password e il nome utente nell'URL.
Clark Vera

@ Lexelby: il nome utente è "l'utente" e la password è "e la password" in spagnolo. Quindi immagino che queste non siano credenziali reali.
pdr

Risposte:


49

Puoi includere utente e password come parte dell'URL:

http://user:passwd@www.server.com/index.html

vedere questo URL, per ulteriori informazioni

Credenziali di autenticazione di base HTTP passate nell'URL e nella crittografia

ovviamente, avrai bisogno della password del nome utente, non lo è 'Basic hashstring.

spero che questo ti aiuti...


6
Quella soluzione non funzionerà per il browser nativo di Android (Pre KitKat). Il nome utente / modulo di accesso verrà comunque visualizzato per il tuo utente, quindi fai attenzione.
Sterling Bourne

58
Questo metodo espone il nome utente e la password a chiunque ascolti sulla rete o sui dispositivi ...
Adam

5
Anche la stringa hash @Adam non è sicura
Mustafa

38
Questo non risponde affatto alla domanda. Passarlo come URL non è un'intestazione.
jemiloii

5
motivo del voto negativo: developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . Verso la fine dell'articolo, si menziona cheThe use of these URLs is deprecated
anurupr

70

Per https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding e http://en.wikipedia.org/wiki/Basic_access_authentication , ecco invece come eseguire l'autenticazione di base con un'intestazione di inserire il nome utente e la password nell'URL. Nota che questo ancora non nasconde il nome utente o la password a chiunque abbia accesso alla rete o questo codice JS (ad esempio un utente che lo esegue in un browser):

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});

1
Nota: per il funzionamento di questa funzione in IE6,7,8,9 sarà necessario un polyfill window.btoa come Base64.js. Anche unescape è deprecato secondo ECMAScript v3.
null

@Techbrunch ti sbagli, l'esempio di seanp2k funziona molto bene, usa un trucco molto noto per decodificare i caratteri Unicode in ASCII, in realtà usa il fatto che (un) escape non supporta Unicode, ma (dec) encodeURIComponent lo fa ..

41

Risposta di NodeJS:

Nel caso in cui volessi farlo con NodeJS: crea un endpoint GET to JSON con Authorizationintestazione e ottieni una risposta Promise:

Primo

npm install --save request request-promise

( vedi su npm ) e poi nel tuo .jsfile:

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = Buffer.from(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});

1
Grazie, mi hai salvato la giornata :)
Sparw

Grazie, questo ha funzionato nella mia applicazione
React

13

Se ti trovi in ​​un ambiente browser puoi anche utilizzare btoa .

btoaè una funzione che accetta una stringa come argomento e produce una stringa ASCII codificata Base64. È supportato dal 97% dei browser .

Esempio:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

È quindi possibile aggiungere Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=all'intestazione authorization.

Nota che si applicano i soliti avvertimenti sull'autenticazione HTTP BASIC, soprattutto se non invii il tuo traffico su https un intercettato può semplicemente decodificare la stringa codificata Base64 ottenendo così la tua password.

Questa risposta di security.stackexchange.com offre una buona panoramica di alcuni degli svantaggi.


3

non è necessario utilizzare utente e password come parte dell'URL

puoi provare questo

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.