¿Autenticación básica con recuperación?

122

Quiero escribir una autenticación básica simple con fetch, pero sigo recibiendo un error 401. Sería increíble si alguien me dijera qué está mal con el 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()
}
daniel.lozynski
fuente

Respuestas:

117

Falta un espacio entre Basicel nombre de usuario y la contraseña codificados.

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));
Lukasz Wiktor
fuente
8
¿No están integrados atob y btoa en la especificación de Javascript?
Martin
6
Las 2 funciones están disponibles en todos los navegadores principales, pero no creo que estén cubiertas por ninguna especificación ES. En particular, no los encontrará en node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor
Tenga en cuenta que esto NO establece una sesión para el navegador. Puede usar XHR para establecer una sesión y evitar la codificación base64. Ver: stackoverflow.com/a/58627805/333296
Nux
Error de referencia no detectado: base64 no está definido
Sveen
@Sveen se base64refiere a la biblioteca importada en la publicación original. No es un global integrado, sino una biblioteca que se importó en el módulo CJS.
oligofren
90

Una solución sin dependencias.

Nodo

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

Navegador

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
qoomon
fuente
5
En un navegador puede usar window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller
1
para admitir caracteres especiales, algo como window.btoa(unescape(encodeURIComponent(string)));debería hacer el trabajo, puede leer más sobre esto aquí: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller
Además, dependiendo de su versión de nodo fetch, no existe allí.
dovidweisz
18

También puede usar btoa en lugar de base64.encode ().

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
Ilya
fuente
1. solo en navegadores 2. solo con caracteres ascii.
Lukas Liesis
7

Si tiene un servidor de backend que solicita las credenciales de autenticación básica antes de la aplicación, entonces esto es suficiente, lo reutilizará entonces:

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

Un ejemplo sencillo de copiar y pegar en la consola de Chrome:

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

USUARIOS DE NODO (REACCIONAR, EXPRESAR) SIGAN ESTOS PASOS

  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. No olvide definir toda esta función como async

kumar kundan
fuente
1

Compartiré un código que tiene un cuerpo de solicitud de datos de formulario de encabezado de autenticación 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);
   });
Manoj Perumarath
fuente
0

Esto no está directamente relacionado con el problema inicial, pero probablemente ayudará a alguien.

Enfrenté el mismo problema cuando intentaba enviar una solicitud similar usando una cuenta de dominio. Entonces, el problema mío no fue el carácter de escape en el nombre de inicio de sesión.

Mal ejemplo:

'ABC\username'

Buen ejemplo:

'ABC\\username'
DJ-Glock
fuente
Esto es solo porque necesita escapar del carácter de escape de la cadena js en sí, sin embargo, esto no está relacionado con la autenticación básica.
qoomon
@qoomon correcto. Por eso mencioné que no está directamente relacionado, pero que podría ser útil.
DJ-Glock