使用 fetch 进行基本身份验证?

IT技术 javascript fetch-api
2021-01-29 05:47:25

我想用 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();
6个回答

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

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));
@Sveenbase64指的是原始帖子中导入的库。它不是内置的全局变量,而是在 CJS module中导入的库。
2021-03-29 05:47:25
未捕获的 ReferenceError:未定义 base64
2021-04-04 05:47:25
这 2 个函数在所有主流浏览器中都可用,但我认为任何 ES 规范都没有涵盖它们。特别是,你不会在 node.js github.com/nodejs/node/issues/3462 中找到它们
2021-04-06 05:47:25
Javascript 规范中不是内置了 atob 和 btoa 吗?
2021-04-10 05:47:25
请注意,这不会为浏览器建立会话。您可以使用 XHR 来建立会话并避免使用 base64 编码。参见:stackoverflow.com/a/58627805/333296
2021-04-10 05:47:25

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

节点

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

浏览器

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
要支持特殊字符,例如 window.btoa(unescape(encodeURIComponent(string)));应该完成这项工作,您可以在此处阅读更多相关信息:developer.mozilla.org/en-US/docs/Web/API/WindowBase64/...
2021-03-18 05:47:25
也取决于您的节点版本在fetch那里不存在。
2021-03-25 05:47:25
在浏览器中,您可以使用window.btoa(username + ':' + password); developer.mozilla.org/en-US/docs/Web/API/WindowBase64/...
2021-04-10 05:47:25

在纯 JavaScript 中,您还可以使用btoa代替base64.encode()

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

请注意,这仅适用于 ASCII 字符。

如果您必须处理不同的编码,请参阅链接的btoa文档。

1. 仅在浏览器中 2. 仅与 ascii 字符。
2021-04-05 05:47:25

复制粘贴到 Chrome 控制台的简单示例:

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

或与await

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

如果您有一个后端服务器在应用程序之前要求提供基本身份验证凭据,那么这就足够了,它将重新使用它,然后:

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