Getirme ile temel kimlik doğrulama?


122

Getirme ile basit bir temel kimlik doğrulaması yazmak istiyorum, ancak sürekli bir 401 hatası alıyorum. Birisi bana kodda neyin yanlış olduğunu söylerse harika olurdu

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

Yanıtlar:


117

Basicİle kodlanmış kullanıcı adı ve şifre arasında boşluk eksik .

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

8
Atob ve btoa, Javascript spesifikasyonunda yerleşik değil mi?
Martin

6
2 işlev tüm büyük tarayıcılarda mevcuttur, ancak bunların herhangi bir ES spesifikasyonu kapsamında olduğunu sanmıyorum. Özellikle, onları node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor

Bunun tarayıcı için bir oturum oluşturmadığını unutmayın. Hem bir oturum oluşturmak hem de base64 kodlamasından kaçınmak için XHR'yi kullanabilirsiniz. Bakınız: stackoverflow.com/a/58627805/333296
Nux

Yakalanmamış Referans
Hatası

@Sveen base64, orijinal gönderide içe aktarılan kitaplığı ifade eder. Yerleşik bir global değil, CJS modülünde içe aktarılan bir kitaplıktır.
oligofren

90

Bağımlılık içermeyen bir çözüm.

düğüm

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

Tarayıcı

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

5
Bir tarayıcıda window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
özel karakterleri desteklemek için bir şeyin window.btoa(unescape(encodeURIComponent(string)));işi yapması gerektiği gibi , bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

Ayrıca düğüm sürümünüze bağlı olarak fetchorada mevcut değildir.
dovidweisz

18

Base64.encode () yerine btoa da kullanabilirsiniz .

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

1. yalnızca tarayıcılarda 2. yalnızca ascii karakterleriyle.
Lukas Liesis

7

Uygulamadan önce Temel Kimlik Doğrulama kimlik bilgilerini isteyen bir arka uç sunucunuz varsa, bu yeterlidir, ardından şunu yeniden kullanacaktır:

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

4

Chrome konsoluna kopyalayıp yapıştırmaya basit bir örnek:

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

2

NODE KULLANICILARI (REACT, EXPRESS) BU ADIMLARI TAKİP EDİN

  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. Tüm bu işlevi şu şekilde tanımlamayı unutmayın: async


1

Temel Kimlik Doğrulama Başlığı form veri istek gövdesine sahip bir kodu paylaşacağım,

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

Bu doğrudan ilk sorunla ilgili değildir, ancak muhtemelen birine yardımcı olacaktır.

Etki alanı hesabını kullanarak benzer istek göndermeye çalışırken aynı sorunla karşılaştım. Yani benim sorunum, oturum açma adında kaçan karakterde değildi.

Kötü örnek:

'ABC\username'

İyi örnek:

'ABC\\username'

Bunun nedeni js dizge çıkış karakterinin kendisinden kaçmanız gerektiğidir, ancak bu temel auth ile ilgili değildir.
qoomon

@qoomon doğru. Bu yüzden doğrudan ilgili olmadığını, ancak yardımcı olabileceğini söylemiştim.
DJ-Glock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.