【问题标题】:Axios POST request to Twillio returns with an Authentication Error?对 Twilio 的 Axios POST 请求返回身份验证错误?
【发布时间】:2023-01-14 08:03:57
【问题描述】:

在 Node.js 中,我正在尝试使用 Axios 向 Twilio 发送 POST 请求,并向我的手机发送短信。但我收到“错误:身份验证错误 - 未提供凭据?”这是代码:

const body = {
  'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
  Body: 'hi from vsc',
  To: toNumber,
  From: fromNumber,
};

const headers = {
  'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
  Authorization: `Basic ${accountSID}:${authToken}`,
};

exports.axios = () => axios.post(`https://api.twilio.com/2010-04-01/Accounts/${accountSID}/Messages.json`, body, headers).then((res) => {
  console.log(res, 'res');
}).catch((err) => {
  console.log(err);
});

我也尝试使用与 POSTMAN 相同的参数并且 POST 请求成功。我还尝试将我的授权用户名和密码编码为 Base 64,但没有成功。 我写信给 Twilio 客户帮助,但尚未收到任何回复。

【问题讨论】:

  • 不是直接的答案,但是您是否有理由选择不为此使用 twilio 的 Node sdk? twilio.com/docs/libraries/node
  • 是的,我以前使用过 sdk,但是我有很多请求被执行,当我编写测试和制作包装函数时,axios 是一个更好的选择。
  • 也许你需要 base64 编码:${accountSID}:${authToken}
  • 授权:Basic ${base64.encode(${process.env.TWILIO_ACCOUNT_SID}:${process.env.TWILIO_AUTH_TOKEN}`

标签: node.js axios twilio


【解决方案1】:

Axios 提供了一个 auth 选项,它接受一个带有 usernamepassword 选项的对象。您可以将 username 设置为您的帐户 SID,并将 password 设置为您的身份验证令牌。

headers 对象应该作为配置对象的 headers 参数在第三个参数中发送给axios.post。像这样:

const params = new URLSearchParams();
params.append('Body','Hello from vcs');
params.append('To',toNumber);
params.append('From',fromNumber);

const headers = {
  'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
};

exports.axios = () => axios.post(
  `https://api.twilio.com/2010-04-01/Accounts/${accountSID}/Messages.json`,
  params,
  { 
    headers,
    auth: {
      username: accountSID,
      password: authToken
    }
  }
}).then((res) => {
  console.log(res, 'res');
}).catch((err) => {
  console.log(err);
});

【讨论】:

  • 尝试了一下,出现错误:消息:“需要‘收件人’电话号码。”。就像我说的,我试图在 Postman 中模拟这一点,并且消息已成功发送到我的手机。我猜授权没问题,因为我没有收到错误消息“身份验证错误 - 未提供凭据”?
  • 是的,auth 现在没问题了,但它没有正确发送正文。那是因为正文需要作为 url 编码参数发送,而不是作为 JSON 对象。我现在在路上,所以无法更新我的答案,但可以考虑使用 URLSearchParams 构建主体。
  • 是的!使用 URLSearchParams 就成功了。谢谢 如果有人有同样的问题: const params = new URLSearchParams(); params.append('Body','来自 vcs 的你好'); params.append('To',toNumber); params.append('From',fromNumber);
  • 感谢您自己这样做,我将更新我的答案以显示完整结果。
【解决方案2】:

Headers 实际上是配置的一个字段,尝试这样的事情:

const config = {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
    Authorization: `Basic ${accountSID}:${authToken}`,
  }
}

axios.post(URL, data, config).then(...)

【讨论】:

  • 也试过这个,但出现错误:消息:“需要‘收件人’电话号码。”。我想授权没问题,因为我现在没有收到错误消息“身份验证错误 - 未提供凭据”?
【解决方案3】:

或者这个(调用 Twilio 端点的一般示例)

const axios = require('axios');

const roomSID = 'RM1...';
const participantSID = 'PA8...';


const ACCOUNT_SID = process.env.ACCOUNT_SID;
const AUTH_TOKEN = process.env.AUTH_TOKEN;

 const URL = "https://insights.twilio.com/v1/Video/Rooms/"+roomSID+"/Participants/"+participantSID;
    axios({
      method: 'get',
      url: URL,
      auth: {
        username: ACCOUNT_SID,
        password: AUTH_TOKEN
      }
    })
      .then((response) => {
        console.log(response.data);
      })
      .catch((error) => {
          console.log(error);
      });

【讨论】:

    【解决方案4】:

    工作代码:

    const params = new URLSearchParams();
    
    params.append('Body','Hello from vcs');
    params.append('To',toNumber);
    params.append('From',fromNumber);
    
    exports.axios = () => axios.post(
      `https://api.twilio.com/2010-04-01/Accounts/${accountSID}/Messages.json`,
      params,
      {
        auth: {
          username: accountSID,
          password: authToken,
        },
      },
    ).then((res) => {
      console.log(res, 'res');
    }).catch((err) => {
      console.log(err);
    });
    

    【讨论】:

      【解决方案5】:

      上述解决方案对我不起作用。我遇到了 Can't find variable: btoa 错误或 A 'To' phone number is required.

      使用 qs 对我有用:

      import qs from 'qs';
      import axios from 'axios';
      
      const TWILIO_ACCOUNT_SID = ""
      const TWILIO_AUTH_TOKEN = ""
      const FROM = ""
      const TO = ""
      
      const sendText = async (message: string) => {
        try {
          const result = await axios.post(
            `https://api.twilio.com/2010-04-01/Accounts/${TWILIO_ACCOUNT_SID}/Messages.json`,
            qs.stringify({
              Body: message,
              To: TO,
              From: FROM,
            }),
            {
              headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
              },
              auth: {
                username: TWILIO_ACCOUNT_SID,
                password: TWILIO_AUTH_TOKEN,
              },
            },
          );
          console.log({result});
        } catch (e) {
          console.log({e});
          console.log({e: e.response?.data});
        }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 2017-07-29
        • 2020-06-02
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多