使用提取进行基本身份验证?


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

Answers:


117

Basic和编码的用户名和密码之间缺少空格。

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

8
atob和btoa是否内置在Javascript规范中?
马丁

6
这两个功能在所有主流浏览器中都可用,但是我认为它们不属于任何ES规范。特别是,您不会在node.js github.com/nodejs/node/issues/3462中
Lukasz 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

您也可以使用btoa代替base64.encode()。

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

请按照以下步骤操作NODE用户(反应,表达)

  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字符串转义字符本身,但是这与基本身份验证无关。
qoomon

@qoomon正确。这就是为什么我提到它并不直接相关,但是可能会有所帮助。
DJ-Glock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.