Repository navigation
Description
Description:
When both mirror and mirror-token are set, setup-node sends the mirror token to GitHub. It goes to two places in official_builds.ts:
- The
actions/node-versionsmanifest request throughtc.getManifestFromRepo, ingetManifest. - The binary download through
tc.downloadTool, insetupNodeJs. This URL comes from the manifest'sdownload_url, so it always points togithub.com/actions/node-versions/releases/....
Both use this pattern:
this.nodeInfo.mirror && this.nodeInfo.mirrorToken
? this.nodeInfo.mirrorToken
: this.nodeInfo.authThis causes two problems:
- Security: A credential meant for a private mirror, such as an Artifactory token, gets sent to a third-party host. Mirror tokens should only go to the mirror.
- Rate limits: Because the mirror token replaces the GitHub
token, manifest calls are made without the GitHub token. That makes them more likely to hit GitHub API rate limits. Only usemirrorTokeningetManifestif it's provided #1548 fixed this only for the case wheremirror-tokenis empty.
The calls that do go to the mirror already use mirrorToken correctly: getNodeJsVersions, downloadNodejs, and the Windows fallback in base-distribution.ts.
Related: #1412, #1467, #1548, #1661
Action version:
actions/setup-node@v7 (current main, 7.1.0). This happens in every version that sends mirror-token to the manifest request.
Platform:
- Ubuntu
- macOS
- Windows
Runner type:
- Hosted
- Self-hosted
Tools version:
Any Node.js version that is in the actions/node-versions manifest. This doesn't depend on the package manager.
Repro steps:
- Use this step:
- uses: actions/setup-node@v7
with:
node-version: '24.9.0'
mirror: 'https://my-mirror.example.com'
mirror-token: ${{ secrets.MIRROR_TOKEN }}- Pick a
node-versionthat is in theactions/node-versionsmanifest and not already in the runner's tool cache. - Watch the outgoing requests, for example with a proxy. The manifest request to the GitHub API and the binary download from
github.com/actions/node-versions/releases/...both sendAuthorization: <MIRROR_TOKEN>.
Expected behavior:
Requests to GitHub always use token, sent as token <token> (this.nodeInfo.auth). mirror-token is only sent to URLs built from mirror.
Actual behavior:
mirror-token is sent to the GitHub API and to github.com release downloads instead of the GitHub token. This sends the mirror credential to GitHub, and the manifest call is made without the GitHub token.
Proposed fix:
- In
official_builds.ts, passthis.nodeInfo.authto bothtc.getManifestFromRepoand the manifest-basedtc.downloadToolcall. Remove themirror && mirrorTokenternary. - Add tests to
__tests__/official-installer.test.ts. No current test checks this case. The existingmirror-tokentests only check log messages and that a download happened. With bothmirrorandmirror-tokenset, the new tests should check that:getManifestFromRepois called with'token <token>', not the mirror token.downloadToolgets'token <token>'for thegithub.com/actions/node-versions/releases/...URL.- Requests to the mirror still use
mirror-token.
Activity
v-gowridurgad commentedon Nov 6, 2026
Hi @KB1RMA, thanks for reporting this. The token-selection logic was introduced with private mirror support and later updated to handle an empty mirror-token. we’ll review the reported behavior alongside the original implementation and follow-up changes to determine whether any adjustments are needed.