使用Personal Access Token下载GitHub私有Release资产返回404求助
问题描述
我拥有一个对仓库Releases具备只读权限的Personal Access Token(PAT),通过以下curl命令能正常获取最新Release的JSON数据:
RELEASE_JSON=$(curl -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "X-GitHub-Api-Version: 2022-11-28" \ $API_BASE_URL/releases/latest)
接着用jq提取包含"api.yaml"的资产的browser_download_url:
DOWNLOAD_URL=$(echo $RELEASE_JSON | \ jq -r '.assets[] | \ select(.name | contains("api.yaml")) | .browser_download_url')
这个URL在浏览器中可以正常下载文件,但使用curl或wget携带Bearer Token通过CLI下载时:
TEMP_FILE=$(mktemp).yaml curl \ -o $TEMP_FILE \ -H "Authorization: Bearer $ACCESS_TOKEN" \ $DOWNLOAD_URL
或
wget \ --header "Authorization: Bearer $ACCESS_TOKEN" \ $DOWNLOAD_URL -O $TEMP_FILE
均返回404 Not Found,请问哪里操作有误?
解决方法及原因
出现404的核心原因是:GitHub返回的browser_download_url是面向浏览器的跳转链接,对应的是GitHub资产CDN,而CDN服务器不识别Authorization: Bearer请求头。浏览器能正常下载是因为它会自动处理跳转并携带会话信息,而CLI工具的Bearer头无法被CDN识别。
你可以用以下两种方法解决:
方法一:使用GitHub Assets API的正式端点下载
从Release的JSON数据中提取资产的url字段(而非browser_download_url),这个是GitHub API的正式端点,支持Bearer头认证:
# 提取API下载端点而非浏览器跳转URL DOWNLOAD_API_URL=$(echo $RELEASE_JSON | \ jq -r '.assets[] | \ select(.name | contains("api.yaml")) | .url') # 用API端点下载,带上原有的API认证头 TEMP_FILE=$(mktemp).yaml curl -L \ -o $TEMP_FILE \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "X-GitHub-Api-Version: 2022-11-28" \ $DOWNLOAD_API_URL
方法二:在browser_download_url后附加token查询参数
如果坚持使用browser_download_url,可以将PAT作为token查询参数附加到URL末尾,CDN会识别这个参数:
# curl方式 TEMP_FILE=$(mktemp).yaml curl -L \ -o $TEMP_FILE \ $DOWNLOAD_URL?token=$ACCESS_TOKEN # wget方式 wget $DOWNLOAD_URL?token=$ACCESS_TOKEN -O $TEMP_FILE
内容的提问来源于stack exchange,提问作者Petra Barus
相关产品推荐
相关产品推荐

