我想用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();

当前回答

这与最初的问题没有直接关系,但可能会对某些人有所帮助。

我遇到同样的问题时,试图发送类似的请求使用域帐户。所以我的问题是登录名中没有转义字符。

不好的例子:

'ABC\username'

很好的例子:

'ABC\\username'

其他回答

如果你有一个后端服务器在应用程序之前要求基本认证凭证,那么这就足够了,它将重新使用它:

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

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

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

一个简单的复制粘贴到Chrome控制台的例子:

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

或者带着等待:

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

这与最初的问题没有直接关系,但可能会对某些人有所帮助。

我遇到同样的问题时,试图发送类似的请求使用域帐户。所以我的问题是登录名中没有转义字符。

不好的例子:

'ABC\username'

很好的例子:

'ABC\\username'

没有依赖关系的解决方案。

Node

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

浏览器

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