You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何通过Digest Auth调用短信API?

解决Axios调用Digest Auth API的方案

方法1:使用axios-digest-auth库(推荐)

这个库封装了Digest Auth的完整流程,自动处理首次请求获取nonce、生成认证头的逻辑,无需手动处理两次请求。

  • 安装依赖:
npm install axios-digest-auth
  • 调用示例:
const AxiosDigestAuth = require('axios-digest-auth').default;

// 初始化Digest Auth实例
const digestAuth = new AxiosDigestAuth({
  username: '你的API用户名',
  password: '你的API密码'
});

// 发送短信请求
async function sendSMS() {
  try {
    const res = await digestAuth.request({
      url: '你的短信API地址',
      method: 'POST', // 按API要求调整请求方法
      data: {
        phone: '目标手机号',
        content: '短信内容'
      }
    });
    console.log('发送成功:', res.data);
  } catch (err) {
    console.error('请求失败:', err.response?.data || err.message);
  }
}

sendSMS();

方法2:手动实现Digest Auth流程

如果第三方库不兼容你的API,可以手动处理两次请求流程:先发送无认证请求获取认证参数,再生成认证头发起正式请求。

const axios = require('axios');
const crypto = require('crypto');

async function sendSMSWithDigest() {
  const username = '你的API用户名';
  const password = '你的API密码';
  const apiUrl = '你的短信API地址';
  const reqData = { phone: '目标手机号', content: '短信内容' };

  try {
    // 第一步:获取认证参数
    const firstRes = await axios.post(apiUrl, reqData, {
      validateStatus: () => true // 允许接收401响应
    });

    if (firstRes.status !== 401) {
      console.log('发送成功:', firstRes.data);
      return;
    }

    // 解析WWW-Authenticate头中的参数
    const authHeader = firstRes.headers['www-authenticate'];
    const authParams = {};
    authHeader.replace(/(\w+)="([^"]+)"/g, (_, key, val) => authParams[key] = val);

    // 生成Digest认证所需哈希值
    const ha1 = crypto.createHash('md5').update(`${username}:${authParams.realm}:${password}`).digest('hex');
    const ha2 = crypto.createHash('md5').update(`POST:${apiUrl}`).digest('hex'); // 方法需与请求一致
    const nonceCount = '00000001';
    const cnonce = crypto.randomBytes(8).toString('hex');
    const responseHash = crypto.createHash('md5').update(`${ha1}:${authParams.nonce}:${nonceCount}:${cnonce}:${authParams.qop}:${ha2}`).digest('hex');

    // 构建认证头
    const authString = `Digest username="${username}", realm="${authParams.realm}", nonce="${authParams.nonce}", uri="${apiUrl}", qop=${authParams.qop}, nc=${nonceCount}, cnonce="${cnonce}", response="${responseHash}"`;

    // 第二步:发送带认证头的请求
    const finalRes = await axios.post(apiUrl, reqData, {
      headers: { 'Authorization': authString }
    });

    console.log('发送成功:', finalRes.data);
  } catch (err) {
    console.error('请求失败:', err.response?.data || err.message);
  }
}

sendSMSWithDigest();

注意事项

  • 确认请求方法(POST/GET)与API要求一致,手动实现时ha2的生成必须对应请求方法。
  • 若API返回的WWW-Authenticate包含opaque等额外参数,需将其添加到认证头中。
  • 检查用户名、密码是否正确,Postman中能成功说明账号信息没问题,重点看代码中参数是否匹配。

内容的提问来源于stack exchange,提问作者dev.muhammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:04:50