Базовая аутентификация с выборкой?

Я хочу написать простую базовую аутентификацию с помощью fetch, но постоянно получаю ошибку 401. Было бы здорово, если бы кто-нибудь сказал мне, что не так с кодом:

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

person daniel.lozynski    schedule 08.05.2017    source источник


Ответы (8)


Вам не хватает пробела между Basic и закодированными именем пользователя и паролем.

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));
person Lukasz Wiktor    schedule 08.05.2017
comment
Разве atob и btoa не встроены в спецификацию Javascript? - person Martin; 12.03.2019
comment
Эти две функции доступны во всех основных браузерах, но я не думаю, что они охватываются какой-либо спецификацией ES. В частности, вы не найдете их в node.js github.com/nodejs/node/issues. /3462 - person Lukasz Wiktor; 13.03.2019
comment
Обратите внимание, что это НЕ устанавливает сеанс для браузера. Вы можете использовать XHR, чтобы установить сеанс и избежать кодирования base64. См.: stackoverflow.com/a/58627805/333296 - person Nux; 30.10.2019
comment
Uncaught ReferenceError: base64 не определен - person Sveen; 29.02.2020
comment
@Sveen base64 относится к библиотеке, импортированной в исходном сообщении. Это не встроенный глобал, а библиотека, которая была импортирована в модуль CJS. - person oligofren; 02.04.2020

Решение без зависимостей.

Узел

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

Браузер

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
person qoomon    schedule 24.07.2018
comment
В браузере вы можете использовать window.btoa(username + ':' + password); developer.mozilla.org/en -US/docs/Web/API/WindowBase64/ - person Andreas Riedmüller; 08.01.2019
comment
для поддержки специальных символов нужно что-то вроде window.btoa(unescape(encodeURIComponent(string)));, вы можете прочитать об этом здесь: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/ - person Andreas Riedmüller; 08.01.2019
comment
Также в зависимости от вашей версии node fetch там не существует. - person dovidweisz; 08.02.2019

Вы также можете использовать btoa вместо base64.encode().

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
person Ilya    schedule 08.04.2019
comment
1. только в браузерах 2. только с символами ascii. - person Lukas Liesis; 22.06.2020

Простой пример копирования и вставки в консоль Chrome:

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

Если у вас есть внутренний сервер, который запрашивает учетные данные Basic Auth перед приложением, этого достаточно, тогда оно будет повторно использовать их:

fetch(url, {
  credentials: 'include',
}).then(...);
person OZZIE    schedule 07.01.2019

ПОЛЬЗОВАТЕЛИ УЗЛА (REACT,EXPRESS) ВЫПОЛНЯЮТ ЭТИ ШАГИ

  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. Не забудьте определить всю эту функцию как async

person kumar kundan    schedule 04.06.2019

Я поделюсь кодом с телом запроса данных формы 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);
   });
person Manoj Perumarath    schedule 14.06.2018

Это не имеет прямого отношения к исходной проблеме, но, вероятно, кому-то поможет.

Я столкнулся с той же проблемой, когда пытался отправить аналогичный запрос, используя учетную запись домена. Итак, моя проблема заключалась в отсутствии экранированного символа в имени для входа.

Плохой пример:

'ABC\username'

Хороший пример:

'ABC\\username'
person DJ-Glock    schedule 20.11.2019
comment
Это просто потому, что вам нужно экранировать сам escape-символ строки js, однако это не связано с базовой аутентификацией. - person qoomon; 24.01.2020
comment
@qoomon правильно. Вот почему я упомянул, что это не имеет прямого отношения, но может быть полезно. - person DJ-Glock; 25.01.2020