Linux下Curl请求API返回401未授权问题求助
解决curl请求API返回401未授权的问题
1. 修复Basic Auth的Base64编码问题
你的脚本中用echo "$user:$password" | base64生成认证字符串时,echo默认会在末尾添加换行符,导致Base64编码结果包含换行,服务器无法正确解析。修改为不带换行的输出:
#!/bin/bash url="https://komat/api/v1/jedh" user="toto" password="blomatis!" curl_opts=( --insecure --request GET --header "Accept: application/json" --header "Authorization: Basic $(echo -n "$user:$password" | base64 )" ) curl "${curl_opts[@]}" "$url"
或者直接使用curl内置的--user参数自动处理Basic Auth,更可靠:
curl --insecure --user "$user:$password" --header "Accept: application/json" "$url"
2. 验证Chrome的认证方式是否为Basic Auth
Chrome能正常访问可能是因为已通过Cookie或其他方式认证,而非Basic Auth。按以下步骤排查:
- 打开Chrome开发者工具(F12),切换到Network标签
- 刷新API页面,找到对应请求,查看Headers中的
Authorization字段是否存在,或是否有Cookie字段 - 如果是Cookie认证,复制Chrome中的Cookie字符串,在curl中添加
--cookie参数:curl --insecure --cookie "COOKIE_KEY=COOKIE_VALUE; ANOTHER_COOKIE=VALUE" --header "Accept: application/json" "$url"
3. 排查curl版本或参数兼容性问题
CentOS 7.9默认的curl版本较旧(通常是7.29.x),可能对某些参数处理有差异:
- 尝试简化命令,直接执行而非用数组传递参数:
curl --insecure -H "Accept: application/json" -H "Authorization: Basic $(echo -n "$user:$password" | base64)" "$url" - 若有需要,可升级curl到新版本(通过EPEL源):
yum install epel-release -y yum update curl -y
4. 检查网络代理或防火墙设置
确认CentOS机器是否设置了HTTP/HTTPS代理,而Chrome未使用:
- 执行
echo $http_proxy $https_proxy查看代理设置 - 若存在代理,可在curl中添加
--noproxy "*"参数禁用代理测试:curl --insecure --noproxy "*" --user "$user:$password" --header "Accept: application/json" "$url"
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

