Базова аутентифікація за допомогою вибору?


122

Я хочу написати просту базову автентифікацію за допомогою отримання, але я все одно отримую помилку 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();

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

Відповіді:


117

Вам не вистачає пробілу між Basicкодованим ім'ям користувача та паролем.

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

8
Хіба не атоб і btoa вбудовані в специфікацію Javascript?
Мартін

6
Дві функції доступні у всіх основних браузерах, але я не думаю, що вони охоплені будь-якою специфікацією ES. Зокрема, ви їх не знайдете у node.js github.com/nodejs/node/isissue/3462
Lukasz Wiktor

Зауважте, що це НЕ встановлює сеанс для браузера. Ви можете використовувати XHR для встановлення сеансу та уникнення кодування base64. Дивіться: stackoverflow.com/a/58627805/333296
Nux

Uncaught ReferenceError: base64 не визначено
Sveen

@Sveen base64посилається на бібліотеку, імпортовану в оригінальній публікації. Це не вбудована глобальна система, а бібліотека, яка імпортувалася в модуль CJS.
олігофрен

90

Рішення без залежностей.

Вузол

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

Веб-переглядач

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

5
У браузері ви можете використовувати window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
Щоб підтримати спеціальних персонажів, як-то window.btoa(unescape(encodeURIComponent(string)));має зробити цю роботу, ви можете прочитати більше про це тут: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

Також залежно від вашої версії вузла fetchтам не існує.
dovidweisz

18

Ви також можете використовувати btoa замість base64.encode ().

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

1. тільки в браузерах 2. тільки з символами ascii.
Лукас Лейсіс

7

Якщо у вас є резервний сервер, який запитує базові облікові дані Auth перед додатком, цього достатньо, він повторно використовувати це:

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

4

Простий приклад для вставки копії в консоль Chrome:

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

2

КОРИСТУВАТИ КОРИСТУВАННЯ (РЕАКТИВУЙТЕ, ЕКСПРЕССУ) СЛУХАЙТЕ ЦІ КРОКИ

  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


1

Я поділюсь кодом, який містить базовий орган запиту даних про базовий 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

Це не пов'язане безпосередньо з початковим випуском, але, мабуть, комусь допоможе.

Я зіткнувся з тією ж проблемою, коли намагався надіслати подібний запит за допомогою облікового запису домену. Таким чином, моє питання було у не уникнутому символі в імені входу.

Поганий приклад:

'ABC\username'

Хороший приклад:

'ABC\\username'

Це лише тому, що вам потрібно вийти з самого символу втечі rs-рядка, однак це не є основним аутентифікацією.
qoomon

@qoomon правильний. Тому я згадав, що це не пов’язано безпосередньо, але може бути корисним.
DJ-Glock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.