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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:22:27