Autenticazione di base con recupero?


122

Voglio scrivere una semplice autenticazione di base con fetch, ma continuo a ricevere un errore 401. Sarebbe fantastico se qualcuno mi dicesse cosa c'è che non va nel codice:

let base64 = require('base-64');

let url = 'http://eu.httpbin.org/basic-auth/user/passwd';
let username = 'user';
let password = 'passwd';

let headers = new Headers();

//headers.append('Content-Type', 'text/json');
headers.append('Authorization', 'Basic' + base64.encode(username + ":" + password));

fetch(url, {method:'GET',
        headers: headers,
        //credentials: 'user:passwd'
       })
.then(response => response.json())
.then(json => console.log(json));
//.done();

function parseJSON(response) {
return response.json()
}

Risposte:


117

Manca uno spazio tra Basice il nome utente e la password codificati.

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));

8
Atob e btoa non sono integrati nelle specifiche Javascript?
Martin

6
Le 2 funzioni sono disponibili in tutti i principali browser, ma non credo siano coperte da alcuna specifica ES. In particolare, non li troverai in node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor il

Notare che questo NON stabilisce una sessione per il browser. È possibile utilizzare XHR sia per stabilire una sessione sia per evitare la codifica base64. Vedi: stackoverflow.com/a/58627805/333296
Nux

Errore di riferimento non rilevato: base64 non è definito
Sveen

@Sveen si base64riferisce alla libreria importata nel post originale. Non è una globale incorporata, ma una libreria che è stata importata nel modulo CJS.
oligofren

90

Una soluzione senza dipendenze.

Nodo

headers.set('Authorization', 'Basic ' + Buffer.from(username + ":" + password).toString('base64'));

Browser

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));

5
In un browser puoi utilizzare window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
per supportare caratteri speciali qualcosa come window.btoa(unescape(encodeURIComponent(string)));dovrebbe fare il lavoro, puoi leggere di più su questo qui: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

Inoltre, a seconda della versione del nodo fetchnon esiste lì.
dovidweisz

18

Puoi anche usare btoa invece di base64.encode ().

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));

1. solo nei browser 2. solo con caratteri ascii.
Lukas Liesis

7

Se hai un server back-end che richiede le credenziali di autenticazione di base prima dell'app, questo è sufficiente, lo riutilizzerà quindi:

fetch(url, {
  credentials: 'include',
}).then(...);

4

Un semplice esempio di copia-incolla nella console di Chrome:

fetch('https://example.com/path', {method:'GET', 
headers: {'Authorization': 'Basic ' + btoa('login:password')}})
.then(response => response.json())
.then(json => console.log(json));

2

GLI UTENTI DEL NODO (REAZIONE, ESPRESSIONE) SEGUONO QUESTI PASSAGGI

  1. npm install base-64 --save
  2. import { encode } from "base-64";
  3.  const response = await fetch(URL, {
      method: 'post',
      headers: new Headers({
        'Authorization': 'Basic ' + encode(username + ":" + password),
        'Content-Type': 'application/json'
      }),
      body: JSON.stringify({
        "PassengerMobile": "xxxxxxxxxxxx",
        "Password": "xxxxxxx"
      })
    });
    const posts = await response.json();
  4. Non dimenticare di definire l'intera funzione come async


1

Condividerò un codice che ha il corpo della richiesta di dati del modulo di intestazione autenticazione di base,

let username = 'test-name';
let password = 'EbQZB37gbS2yEsfs';
let formdata = new FormData();
let headers = new Headers();


formdata.append('grant_type','password');
formdata.append('username','testname');
formdata.append('password','qawsedrf');

headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));
fetch('https://www.example.com/token.php', {
 method: 'POST',
 headers: headers,
 body: formdata
}).then((response) => response.json())
.then((responseJson) => {
 console.log(responseJson);

 this.setState({
    data: responseJson
 })
  })
   .catch((error) => {
 console.error(error);
   });

0

Questo non è direttamente correlato al problema iniziale, ma probabilmente aiuterà qualcuno.

Ho riscontrato lo stesso problema durante il tentativo di inviare una richiesta simile utilizzando l'account di dominio. Quindi il mio problema riguardava il carattere non sfuggito nel nome di accesso.

Cattivo esempio:

'ABC\username'

Buon esempio:

'ABC\\username'

Questo è solo perché è necessario eseguire l'escape del carattere di escape della stringa js stesso, tuttavia non è correlato all'autenticazione di base.
qoomon

@qoomon corretto. Ecco perché ho detto che non è direttamente correlato, ma potrebbe essere utile.
DJ-Glock
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.