가져 오기를 사용한 기본 인증?


122

fetch로 간단한 기본 인증을 작성하고 싶지만 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
atob 및 btoa가 Javascript 사양에 내장되어 있지 않습니까?
Martin

6
두 가지 기능은 모든 주요 브라우저에서 사용할 수 있지만 ES 사양에 포함되지 않는다고 생각합니다. 특히, Node.js를 그들을 찾을 수 없습니다 github.com/nodejs/node/issues/3462
루카스 Wiktor에게

이것은 브라우저에 대한 세션을 설정하지 않습니다. XHR을 사용하여 세션을 설정하고 base64 인코딩을 방지 할 수 있습니다. 참조 : stackoverflow.com/a/58627805/333296
Nux

잡히지 않은 ReferenceError : base64가 정의되지 않았습니다
Sveen

@Sveen base64은 원본 게시물에서 가져온 라이브러리를 나타냅니다. 내장 글로벌이 아니라 CJS 모듈에서 가져온 라이브러리입니다.
oligofren

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/...
안드레아스 Riedmüller

1
같은 특수 문자 뭔가를 지원하기 위해 window.btoa(unescape(encodeURIComponent(string)));다음 작업을 수행해야합니다, 당신은 더 많은 여기에 대한 읽을 수 developer.mozilla.org/en-US/docs/Web/API/WindowBase64/...
안드레아스 Riedmüller

또한 노드 버전에 따라 fetch존재하지 않습니다.
dovidweisz

18

base64.encode () 대신 btoa 를 사용할 수도 있습니다 .

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

1. 브라우저에서만 2. ASCII 문자로만.
Lukas Liesis

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

노드 사용자 (반응, 명시) 다음 단계를 따르십시오.

  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

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

이것은 초기 문제와 직접적인 관련이 없지만 아마도 누군가를 도울 것입니다.

도메인 계정을 사용하여 유사한 요청을 보내려고 할 때 동일한 문제에 직면했습니다. 그래서 내 문제는 로그인 이름의 이스케이프 문자가 아닙니다.

나쁜 예 :

'ABC\username'

좋은 예 :

'ABC\\username'

이것은 js 문자열 이스케이프 문자 자체를 이스케이프해야하기 때문입니다. 그러나 이것은 기본 인증과 관련이 없습니다.
qoomon

@qoomon이 맞습니다. 그것이 직접적으로 관련이 없지만 도움이 될 수 있다고 언급 한 이유입니다.
DJ-Glock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.