【问题标题】:Basic authentication with fetch?使用 fetch 进行基本身份验证?
【发布时间】:2017-10-06 04:04:12
【问题描述】:

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

【问题讨论】:

    标签: javascript fetch-api


    【解决方案1】:

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

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

    【讨论】:

    • 不是 atob 和 btoa 内置在 Javascript 规范中吗?
    • 这两个函数在所有主流浏览器中都可用,但我认为它们没有被任何 ES 规范所涵盖。特别是,您不会在 node.js github.com/nodejs/node/issues/3462 中找到它们
    • 请注意,这不会为浏览器建立会话。您可以使用 XHR 来建立会话并避免使用 base64 编码。见:stackoverflow.com/a/58627805/333296
    • Uncaught ReferenceError: base64 is not defined
    • @Sveen base64 指的是原帖中导入的库。它不是内置的全局,而是在 CJS 模块中导入的库。
    【解决方案2】:

    没有依赖的解决方案。

    节点

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

    浏览器

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

    【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 1.仅在浏览器中 2. 仅使用 ascii 字符。
    【解决方案4】:

    复制粘贴到 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);
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案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();
          
        4. 别忘了将整个函数定义为async

        【讨论】:

          【解决方案7】:

          我将分享一个具有基本身份验证头表单数据请求正文的代码,

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

          【讨论】:

            【解决方案8】:

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

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

            不好的例子:

            'ABC\username'
            

            好例子:

            'ABC\\username'
            

            【讨论】:

            • 这只是因为您需要对 js 字符串转义字符本身进行转义,但这与基本身份验证无关。
            • @qoomon 正确。这就是为什么我提到它没有直接关系,但可能会有所帮助。
            猜你喜欢
            • 2016-07-01
            • 2022-07-07
            • 1970-01-01
            • 2015-08-12
            • 2017-06-13
            • 2013-05-30
            • 2016-05-31
            • 2013-09-14
            相关资源
            最近更新 更多