Otentikasi dasar dengan pengambilan?

122

Saya ingin menulis otentikasi dasar sederhana dengan pengambilan, tetapi saya terus mendapatkan kesalahan 401. Akan luar biasa jika seseorang memberi tahu saya apa yang salah dengan kode:

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
sumber

Jawaban:

117

Anda kehilangan spasi antara Basicdan nama pengguna dan kata sandi yang dikodekan.

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));
Lukasz Wiktor
sumber
8
Bukankah atob dan btoa ada di dalam spesifikasi Javascript?
Martin
6
Kedua fungsi tersebut tersedia di semua browser utama, tetapi menurut saya fungsi tersebut tidak dicakup oleh spesifikasi ES apa pun. Secara khusus, Anda tidak akan menemukannya di node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor
Perhatikan bahwa ini TIDAK membuat sesi untuk browser. Anda dapat menggunakan XHR untuk membuat sesi dan menghindari encoding base64. Lihat: stackoverflow.com/a/58627805/333296
Nux
ReferenceError Tidak Tertangkap: base64 tidak ditentukan
Sveen
@Sveen base64merujuk ke perpustakaan yang diimpor dalam posting asli. Ini bukan global bawaan, tetapi pustaka yang diimpor dalam modul CJS.
oligofren
90

Solusi tanpa ketergantungan.

Node

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

Browser

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
qoomon.dll
sumber
5
Di browser, Anda dapat menggunakan window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller
1
untuk mendukung karakter khusus seperti window.btoa(unescape(encodeURIComponent(string)));harus melakukan pekerjaan, Anda dapat membaca lebih lanjut tentang ini di sini: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller
Juga tergantung pada versi node fetchAnda tidak ada di sana.
dovidweisz
18

Anda juga bisa menggunakan btoa sebagai ganti base64.encode ().

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
Ilya
sumber
1. hanya di browser 2. hanya dengan karakter ascii.
Lukas Liesis
7

Jika Anda memiliki server backend yang meminta kredensial Basic Auth sebelum aplikasi, maka ini cukup, itu akan digunakan kembali kemudian:

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

Contoh sederhana untuk menyalin-tempel ke konsol Chrome:

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

PENGGUNA NODE (REACT, EXPRESS) IKUTI LANGKAH INI

  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. Jangan lupa untuk mendefinisikan seluruh fungsi ini sebagai async

kumar kundan
sumber
1

Saya akan membagikan kode yang memiliki badan permintaan data formulir Basic 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);
   });
Manoj Perumarath
sumber
0

Ini tidak terkait langsung dengan masalah awal, tetapi mungkin akan membantu seseorang.

Saya menghadapi masalah yang sama ketika mencoba mengirim permintaan serupa menggunakan akun domain. Jadi masalah saya adalah karakter yang tidak lolos dalam nama login.

Contoh buruk:

'ABC\username'

Contoh yang baik:

'ABC\\username'
DJ-Glock
sumber
Ini hanya karena Anda perlu keluar dari karakter js string escape itu sendiri, namun ini bukan terkait auth dasar.
qoomon
@oomon benar. Itu sebabnya saya sebutkan bahwa ini tidak terkait langsung, tetapi mungkin bisa membantu.
DJ-Glock