लाने के साथ मूल प्रमाणीकरण?


122

मैं एक साधारण मूल प्रमाणीकरण लाना चाहता हूं, लेकिन मुझे एक 401 त्रुटि मिलती रहती है। यह बहुत अच्छा होगा अगर कोई मुझे बताए कि कोड में क्या गलत है:

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

जवाबों:


117

आप के बीच Basicऔर एन्कोडेड उपयोगकर्ता नाम और पासवर्ड के बीच एक स्थान याद कर रहे हैं।

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

8
Isas atob और btoa को जावास्क्रिप्ट विनिर्देश में बनाया गया है?
मार्टिन

6
2 फ़ंक्शन सभी प्रमुख ब्राउज़रों में उपलब्ध हैं, लेकिन मुझे नहीं लगता कि वे किसी ईएस विनिर्देश द्वारा कवर किए गए हैं। विशेष रूप से, आप उन्हें नोड.जेएस github.com/nodejs/node/issues/3462
लुकाज़

ध्यान दें कि यह ब्राउज़र के लिए एक सत्र स्थापित नहीं करता है। आप XHR का उपयोग सत्र को स्थापित करने और बेस 64 एनकोडिंग से बचने के लिए कर सकते हैं। देखें: stackoverflow.com/a/58627805/333296
नक्स

बिना संदर्भ रेफ़रर: बेस 64 को परिभाषित नहीं किया गया है
स्वेन

@ स्वेन का base64तात्पर्य मूल पद में आयातित पुस्तकालय से है। यह एक अंतर्निहित वैश्विक नहीं है, बल्कि एक पुस्तकालय है जिसे CJS मॉड्यूल में आयात किया गया था।
ऑलिगॉफ्रेन

90

निर्भरता के बिना एक समाधान।

नोड

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

ब्राउज़र

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

5
ब्राउज़र में आप window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
Andreas Riedmüller

1
विशेष पात्रों का समर्थन करने के लिए कुछ window.btoa(unescape(encodeURIComponent(string)));ऐसा काम करना चाहिए, आप इसके बारे में अधिक यहां पढ़ सकते हैं: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
एंड्रियास रिडमिलर

इसके अलावा आपके नोड के संस्करण के आधार पर fetchवहाँ मौजूद नहीं है।
dovidweisz


7

यदि आपके पास एक बैकएंड सर्वर है जो ऐप से पहले बेसिक प्रामाणिक क्रेडेंशियल के लिए पूछ रहा है तो यह पर्याप्त है, यह उस समय फिर से उपयोग करेगा:

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

4

Chrome कंसोल में कॉपी-पेस्ट करने का एक सरल उदाहरण:

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

2

NODE USERS (REACT, EXPRESS) इन चरणों का पालन करें

  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. इस पूरे समारोह को परिभाषित करना न भूलें async


1

मैं एक कोड साझा करूंगा जिसमें बेसिक ऑर्ड हैडर फॉर्म डेटा रिक्वेस्ट बॉडी है,

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

यह सीधे प्रारंभिक मुद्दे से संबंधित नहीं है, लेकिन शायद किसी की मदद करेगा।

मुझे उसी समस्या का सामना करना पड़ा जब मैं डोमेन खाते का उपयोग करके समान अनुरोध भेजने का प्रयास कर रहा था। तो मेरा मुद्दा लॉगिन नाम में चरित्र नहीं बचा था।

खराब उदाहरण:

'ABC\username'

अच्छा उदाहरण:

'ABC\\username'

यह सिर्फ इसलिए है क्योंकि आपको js string भागने चरित्र से खुद को बचने की आवश्यकता है, हालांकि यह बुनियादी संबंधित नहीं है।
क्यूमोन

@qoomon सही है। इसलिए मैंने उल्लेख किया है कि यह सीधे संबंधित नहीं है, लेकिन सहायक हो सकता है।
डीजे-ग्लॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.