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
相关产品推荐
相关产品推荐

