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

Basic authentication with fetch?

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

您在 Basic 与编码后的用户名和密码之间缺少一个 space。

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

我将分享一个代码,其中包含 Basic Auth Header 表单数据请求正文,

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

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

节点

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

浏览器

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

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

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

在纯 JavaScript 中你也可以使用 btoa 而不是 base64.encode():

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

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

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

节点用户(REACT、EXPRESS)遵循这些步骤

  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

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

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

不好的例子:

'ABC\username'

好例子:

'ABC\username'

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

获得 React Native Mobile 应用程序的授权请求,我花了更多时间在 fetch 中搜索这些行

 var base64 = require("base-64"); // install it before use from npm i base-64

 const uname = "some username goes here";
 const pword = "some password goes here";

const getMovies = async () => {
   try {
     const response = await fetch(
       "API URL goes here",
       {
         headers: {
           Authorization: "Basic " + base64.encode(uname + ":" + pword),
         },
       }
     );

     data = await response.json();
     setData(data);

     console.log(data);
     // console.log(data.name);
     return data;
   } catch (error) {
     console.error(error);
   } finally {
     setLoading(false);
   }
 };

 useEffect(() => {
   getMovies();
 }, []);


// other code 

// inside return
  <FlatList
           keyExtractor={(item) => item.id}
           data={data}
           renderItem={({ item }) => (
             <View style={styles.text_container}>
               <Text>{item.name}</Text>
               <Text>{item.images[0].name}</Text>
               <Text>{item.images[0].src}</Text>
             </View>
           )}
         />