使用fetch进行基本身份验证

dan*_*ski 81 javascript fetch-api

我想用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()
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*tor 82

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

headers.set('Authorization', 'Basic ' + base64.encode(username + ":" + password));
Run Code Online (Sandbox Code Playgroud)

  • 使用node时,必须使用Buffer并指定utf8 `const headers = { Authorization: \`Basic ${Buffer.from("user:pass", "utf-8").toString("base64")}\` }; ` (8认同)
  • atob和btoa是否内置在Javascript规范中? (4认同)
  • @Sveen `base64` 指的是原始帖子中导入的库。它不是内置的全局变量,而是在 CJS 模块中导入的库。 (4认同)
  • 这两个功能在所有主流浏览器中都可用,但我认为它们不属于任何ES规范。特别是,您不会在node.js https://github.com/nodejs/node/issues/3462中找到它们 (3认同)

qoo*_*mon 50

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

headers.set('Authorization', 'Basic ' + Buffer.from(username + ":" + password).toString('base64'));
Run Code Online (Sandbox Code Playgroud)

  • 在浏览器中,您可以使用```window.btoa(username +':'+ password);`https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding (3认同)
  • 支持特殊字符,如 ```window.btoa(unescape(encodeURIComponent(string)));``` 应​​该可以完成这项工作,您可以在这里阅读更多相关信息:https://developer.mozilla.org/en- US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem (2认同)

kol*_*pto 20

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

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

或与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);
Run Code Online (Sandbox Code Playgroud)


小智 10

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

headers.set('Authorization', 'Basic ' + btoa(username + ":" + password));
Run Code Online (Sandbox Code Playgroud)

  • 1. 仅在浏览器中 2. 仅适用于 ASCII 字符。 (4认同)

OZZ*_*ZIE 9

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

fetch(url, {
  credentials: 'include',
}).then(...);
Run Code Online (Sandbox Code Playgroud)


kum*_*dan 6

节点用户(反应、表达)遵循这些步骤

  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();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 不要忘记将整个函数定义为 async