如何使用node-libcurl的NETRC选项实现带认证的HTTP GET请求
问题排查与解决方案
针对你遇到的返回200但内容为认证页面的问题,按以下步骤排查:
1. 修复.netrc文件权限
Unix-like系统中,curl会忽略权限过于开放的.netrc文件(安全限制),执行以下命令设置正确权限:
chmod 600 .netrc
2. 调整NETRC选项值
node-libcurl中NETRC设为true对应curl的CURLOPT_NETRC=1(仅在无其他认证时使用),改为强制使用netrc的模式:
curl.setOpt('NETRC', 2); // 对应CURLOPT_NETRC_REQUIRED
3. 添加Cookie支持
Earthdata认证依赖Cookie维持会话,重定向时需要保留Cookie,添加以下配置:
curl.setOpt('COOKIEJAR', './cookies.txt'); curl.setOpt('COOKIEFILE', './cookies.txt');
4. 启用调试日志定位问题
添加verbose选项查看请求细节,确认认证头是否在重定向时正确发送:
curl.setOpt('VERBOSE', true);
5. 用原生curl命令验证
先脱离node-libcurl测试,确认.netrc和凭证有效:
curl -L --netrc-file .netrc https://cddis.nasa.gov/archive/gps/data/highrate/2022/331/22d/00/ABMF00GLP_S_20223310000_15M_01S_MO.crx.gz -o test.gz
如果命令行能成功下载,说明问题出在node-libcurl的配置;如果失败,检查.netrc的凭证是否正确(确保替换了<username>和<password>为实际值,无多余符号)。
6. 完整调整后的代码示例
const { Curl } = require('node-libcurl'); async function start() { const curl = new Curl(); curl.setOpt('URL', 'https://cddis.nasa.gov/archive/gps/data/highrate/2022/331/22d/00/ABMF00GLP_S_20223310000_15M_01S_MO.crx.gz'); curl.setOpt('FOLLOWLOCATION', true); curl.setOpt('NETRC', 2); // 强制使用netrc curl.setOpt('NETRC_FILE', '.netrc'); curl.setOpt('MAXREDIRS', 5); curl.setOpt('SSL_VERIFYPEER', false); curl.setOpt('SSL_VERIFYHOST', false); curl.setOpt('COOKIEJAR', './cookies.txt'); // 保存Cookie curl.setOpt('COOKIEFILE', './cookies.txt'); // 加载Cookie curl.setOpt('VERBOSE', true); // 调试日志 curl.on('end', function (statusCode, data, headers) { console.info(statusCode); console.info('---'); console.info(data.length); console.info('---'); console.info(data.slice(0, 200)); // 仅打印开头部分,避免输出过多 console.info('---'); console.info(this.getInfo('TOTAL_TIME')); this.close(); }); curl.on('error', curl.close.bind(curl)); curl.perform(); } start();
内容的提问来源于stack exchange,提问作者Daniel Fernandez
相关产品推荐
相关产品推荐

