Autenticação básica com busca?


122

Quero escrever uma autenticação básica simples com fetch, mas continuo recebendo um erro 401. Seria incrível se alguém me dissesse o que há de errado com o código:

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

Respostas:


117

Está faltando um espaço entre Basico nome de usuário e a senha codificados.

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

8
O atob e o btoa não estão integrados à especificação Javascript?
Martin

6
As 2 funções estão disponíveis em todos os principais navegadores, mas não acho que sejam cobertas por nenhuma especificação ES. Em particular, você não os encontrará em node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor

Observe que isso NÃO estabelece uma sessão para o navegador. Você pode usar o XHR para estabelecer uma sessão e evitar a codificação base64. Consulte: stackoverflow.com/a/58627805/333296
Nux

ReferenceError não
capturado

@Sveen base64refere-se à biblioteca importada na postagem original. Não é um global integrado, mas uma biblioteca que foi importada no módulo CJS.
oligofren

90

Uma solução sem dependências.

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

Navegador

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

5
Em um navegador, você pode usar window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
para oferecer suporte a caracteres especiais que window.btoa(unescape(encodeURIComponent(string)));devem fazer o trabalho, você pode ler mais sobre isso aqui: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

Além disso, dependendo da sua versão, o nó fetchnão existe lá.
dovidweisz

18

Você também pode usar btoa em vez de base64.encode ().

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

1. apenas em navegadores 2. apenas com caracteres ascii.
Lukas Liesis

7

Se você tiver um servidor de back-end solicitando as credenciais de autenticação básica antes do aplicativo, isso será suficiente e será reutilizado:

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

4

Um exemplo simples de copiar e colar no console do Chrome:

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

2

USUÁRIOS DE NÓ (REAGIR, EXPRESSAR) SEGUEM ESTAS ETAPAS

  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. Não se esqueça de definir toda esta função como async


1

Vou compartilhar um código que tem corpo de solicitação de dados de formulário de cabeçalho de autenticação básica,

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

Isso não está diretamente relacionado ao problema inicial, mas provavelmente ajudará alguém.

Eu enfrentei o mesmo problema ao tentar enviar uma solicitação semelhante usando uma conta de domínio. Portanto, o meu problema foi no caractere de escape no nome de login.

Mau exemplo:

'ABC\username'

Bom exemplo:

'ABC\\username'

Isso ocorre porque você precisa escapar do próprio caractere de escape da string js; no entanto, isso não é relacionado à autenticação básica.
qoomon

@qoomon correto. É por isso que mencionei que não está diretamente relacionado, mas pode ser útil.
DJ-Glock
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.