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

Respuestas:


117

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

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

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

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

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

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

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


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

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'

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.