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

Jawaban:


117

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

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

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

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

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

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

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


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

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'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.