Podstawowe uwierzytelnianie z pobieraniem?


122

Chcę napisać proste uwierzytelnianie podstawowe z pobieraniem, ale ciągle otrzymuję błąd 401. Byłoby wspaniale, gdyby ktoś mi powiedział, co jest nie tak z kodem:

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

Odpowiedzi:


117

Brakuje spacji między Basiczakodowaną nazwą użytkownika i hasłem a.

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

8
Czy atob i btoa nie są wbudowane w specyfikację Javascript?
Martin

6
Te 2 funkcje są dostępne we wszystkich głównych przeglądarkach, ale nie sądzę, aby były objęte żadną specyfikacją ES. W szczególności nie znajdziesz ich na node.js github.com/nodejs/node/issues/3462
Łukasz Wiktor

Zauważ, że to NIE ustanawia sesji dla przeglądarki. Możesz użyć XHR do ustanowienia sesji i uniknięcia kodowania base64. Zobacz: stackoverflow.com/a/58627805/333296
Nux

Uncaught ReferenceError: base64 nie jest zdefiniowany
Sveen

@Sveen base64odnosi się do biblioteki zaimportowanej w oryginalnym poście. Nie jest to wbudowana globalna biblioteka, ale biblioteka zaimportowana w module CJS.
oligofren

90

Rozwiązanie bez zależności.

Węzeł

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

Przeglądarka

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

5
W przeglądarce możesz użyć window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
aby wspierać znaki specjalne, takie jak window.btoa(unescape(encodeURIComponent(string)));powinno wykonać zadanie, możesz przeczytać więcej na ten temat tutaj: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/ ...
Andreas Riedmüller

Również w zależności od twojej wersji węzła fetchnie istnieje.
dovidweisz

18

Możesz także użyć btoa zamiast base64.encode ().

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

1. tylko w przeglądarkach 2. tylko ze znakami ascii.
Lukas Liesis

7

Jeśli masz serwer zaplecza, który pyta o poświadczenia podstawowego uwierzytelnienia przed aplikacją, to wystarczy, a następnie użyje go ponownie:

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

4

Prosty przykład kopiowania i wklejania do konsoli Chrome:

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

2

UŻYTKOWNICY WĘZŁÓW (REAGUJ, EKSPRESOWO) WYKONUJ TE KROKI

  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. Nie zapomnij zdefiniować całej tej funkcji jako async


1

Udostępnię kod, który ma treść żądania danych Basic Auth Header,

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

Nie jest to bezpośrednio związane z początkową kwestią, ale prawdopodobnie komuś pomoże.

Napotkałem ten sam problem, gdy próbowałem wysłać podobne żądanie przy użyciu konta domeny. Więc mój problem nie zawierał znaku ucieczki w nazwie użytkownika.

Zły przykład:

'ABC\username'

Dobry przykład:

'ABC\\username'

Dzieje się tak tylko dlatego, że musisz zmienić znaczenie samego znaku ucieczki łańcucha js, jednak nie jest to związane z podstawową autoryzacją.
qoomon

@qoomon poprawne. Dlatego wspomniałem, że nie jest to bezpośrednio związane, ale może być pomocne.
DJ-Glock
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.