Xác thực cơ bản với tìm nạp?


122

Tôi muốn viết một xác thực cơ bản đơn giản với tìm nạp, nhưng tôi vẫn gặp lỗi 401. Sẽ thật tuyệt vời nếu ai đó cho tôi biết mã có lỗi:

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

Câu trả lời:


117

Bạn đang thiếu khoảng trắng giữa Basictên người dùng và mật khẩu được mã hóa.

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

8
Có phải atob và btoa được tích hợp vào đặc tả Javascript không?
Martin

6
2 chức năng có sẵn trong tất cả các trình duyệt chính, nhưng tôi không nghĩ rằng chúng được bao phủ bởi bất kỳ thông số kỹ thuật ES nào. Đặc biệt, bạn sẽ không tìm thấy chúng trong node.js github.com/nodejs/node/issues/3462
Lukasz Wiktor

Lưu ý rằng điều này KHÔNG thiết lập một phiên cho trình duyệt. Bạn có thể sử dụng XHR để thiết lập phiên và tránh mã hóa base64. Xem: stackoverflow.com/a/58627805/333296
Nux

Uncaught ReferenceError: base64 không được xác định
Sveen

@Sveen base64đề cập đến thư viện được nhập trong bài đăng gốc. Nó không phải là một toàn cầu tích hợp sẵn, mà là một thư viện đã được nhập trong mô-đun CJS.
oligofren

90

Một giải pháp không có phụ thuộc.

Nút

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

Trình duyệt

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

5
Trong một trình duyệt, bạn có thể sử dụng window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
để hỗ trợ các ký tự đặc biệt giống như window.btoa(unescape(encodeURIComponent(string)));sẽ thực hiện công việc, bạn có thể đọc thêm về điều này tại đây: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

Cũng tùy thuộc vào phiên bản của bạn mà nút fetchkhông tồn tại ở đó.
dovidweisz

18

Bạn cũng có thể sử dụng btoa thay vì base64.encode ().

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

1. chỉ trong các trình duyệt 2. chỉ với các ký tự ascii.
Lukas Liesis

7

Nếu bạn có máy chủ phụ trợ yêu cầu thông tin xác thực Cơ bản trước ứng dụng thì điều này là đủ, nó sẽ sử dụng lại sau đó:

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

4

Một ví dụ đơn giản để sao chép dán vào bảng điều khiển Chrome:

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

2

NGƯỜI DÙNG NODE (REACT, EXPRESS) LÀM THEO CÁC BƯỚC NÀY

  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. Đừng quên xác định toàn bộ chức năng này là async


1

Tôi sẽ chia sẻ mã có nội dung yêu cầu dữ liệu biểu mẫu Tiêu đề xác thực cơ bản,

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

Điều này không liên quan trực tiếp đến vấn đề ban đầu, nhưng có thể sẽ giúp ích cho ai đó.

Tôi đã gặp phải vấn đề tương tự khi cố gắng gửi yêu cầu tương tự bằng tài khoản miền. Vì vậy, vấn đề của tôi là không có ký tự thoát trong tên đăng nhập.

Ví dụ xấu:

'ABC\username'

Ví dụ tốt:

'ABC\\username'

Điều này chỉ là vì bạn cần thoát ký tự thoát chuỗi js, tuy nhiên đây không phải là liên quan đến xác thực cơ bản.
qoomon

@qoomon đúng. Đó là lý do tại sao tôi đã đề cập rằng nó không liên quan trực tiếp, nhưng có thể hữu ích.
DJ-Glock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.