Github 操作,使用 npm 或 yarn 安装 Github 包时出现 401 未授权
Github actions, 401 unauthorized when installing a Github Package with npm or yarn
当我尝试通过 GitHub 操作安装我的 npm
模块时,出现以下错误:
npm ERR! 401 Unauthorized - GET https://npm.pkg.github.com/@xxxx%2fxxxx-analytics - Your request could not be authenticated by the GitHub Packages service. Please ensure your access token is valid and has the appropriate scopes configured.
在你发表评论之前,我已经使用范围和访问令牌正确配置了 .npmrc,并且在本地安装私有包时一切正常。
这是我的 GitHub 工作流程操作:
name: JavaScript workflow
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: '12.x'
- name: npmrc
run: cat .npmrc
- name: npm install
run: |
npm install
env:
CI: true
NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
这是我的 .npmrc
@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXXX
@colonynetworks:registry=https://npm.pkg.github.com
//npm.pkg.github.com:_authToken=XXXXXXXXX
always-auth=true
@react-admin:registry=https://registry.marmelab.com
//registry.marmelab.com:
_auth=XXXXXXXXX
email=software@XXXXXXXXX.com
always-auth=true
这是一个私人仓库,authTokens 目前硬编码在 .npmrc 文件中。
然而,在尝试为此寻找解决方案时,我确实看到了一位 Github 工作人员的随机评论:https://github.community/t/netlify-getting-401-from-github-package-registry-with-auth-token/16415/3
有点含糊,但听起来它不接受 .npmrc 文件中的硬编码 authToken。
所以我尝试的第一件事就是使用我们的环境变量,而不是像这样:
@xxxx=https://npm.pkg.github.com
//npm.pkg.github.com:_authToken=${NPM_AUTH_TOKEN}
我们的 Github 回购机密中的 env 变量是正确的,由工作流提供。
然而,这仍然导致相同的 401 未授权错误。
通过查看其他解决方案,我尝试在 install
步骤之前在 Github 操作中手动生成 .npmrc,如下所示:
- name: npmrcgen
run: |
echo "//npm.pkg.github.com/:_authToken=XXXXXXX" > .npmrc
echo "@xxxxx=https://npm.pkg.github.com/" >> .npmrc
echo "@react-admin:registry=https://registry.marmelab.com" >> .npmrc
echo "//registry.marmelab.com:" >> .npmrc
echo "_auth=XXXXXXX" >> .npmrc
echo "email=software@xxxxx.com" >> .npmrc
echo "always-auth=true" >> .npmrc
在我添加的日志记录步骤中,_authToken(仅适用于 Github)仍然显示为 ***
,我仍然收到 401 未授权错误。
此时我想确认 .npmrc 甚至被使用,所以我删除了我们用于 marmelab.com
的第二个私有注册表,果然,我得到一个错误,说它不再能够安装他们的 ra-realtime
包。这证明 .npmrc 文件确实被我的 Github 操作读取和使用,但它不接受我的 Github 个人访问令牌。
我也尝试生成一个新令牌。它可以完全访问 repo:
以及 write:packages
和 read:packages
下的所有内容,这是应该需要的。
在 Github 操作中仍然是 401 Unauthorized,并且在本地仍然可以正常工作。
最后我尝试用 yarn
而不是 npm
安装它。毫不奇怪,这也没有解决它。
我已经看到并尝试了以下解决方案,但均未成功:
- https://github.com/FerLuisxd/create-npmrc
- https://blog.bitsrc.io/install-npm-private-packages-in-ci-cd-with-github-actions-746db95017cc
有一件事我没有尝试过,因为我没有看到任何关于如何或这是一个好主意的建议,但我没有在 Github 操作中完成 npm login
。由于没有其他人这样做过,并且以某种方式使它起作用,我认为这是没有必要的。
我联系了 GitHub 支持,他们设法找出问题所在。
Github 工作流比本地环境更严格,需要在 auth 令牌前额外 /
:
找出不同之处:
//npm.pkg.github.com:_authToken=XXXXXXXXX. # broken
//npm.pkg.github.com/:_authToken=XXXXXXXXX # works
在 :_authToken=
之前添加额外的 /
解决了我的问题。
在项目的根目录中有一个 .npmrc 文件。
.npmrc 的内容:
registry=https://registry.npmjs.org/
@{scope}:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=********** (Token generated from github)
@{scope} 是您的组织名称或您的用户名。区分大小写。
像我一样在 GitHub 操作的上下文之外遇到此问题的任何其他人的附录:请注意 GitHub 包注册表使用 HTTP Basic Authentication. So if you're trying to test a personal access token 并且不想要要弄乱你的 .npmrc
/ .yarnrc
,你可以在注册表 URL 中传递凭据,例如用纱线:
yarn info "@<github-org>/<repo-name>" \
--registry="https://<github-user>:<token>@npm.pkg.github.com/"
或 curl
:
curl -vL 'http://<github-user>:<token>@npm.pkg.github.com/@<github-org>%2f<repo-name>'
当我尝试通过 GitHub 操作安装我的 npm
模块时,出现以下错误:
npm ERR! 401 Unauthorized - GET https://npm.pkg.github.com/@xxxx%2fxxxx-analytics - Your request could not be authenticated by the GitHub Packages service. Please ensure your access token is valid and has the appropriate scopes configured.
在你发表评论之前,我已经使用范围和访问令牌正确配置了 .npmrc,并且在本地安装私有包时一切正常。
这是我的 GitHub 工作流程操作:
name: JavaScript workflow
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: '12.x'
- name: npmrc
run: cat .npmrc
- name: npm install
run: |
npm install
env:
CI: true
NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
这是我的 .npmrc
@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXXX
@colonynetworks:registry=https://npm.pkg.github.com
//npm.pkg.github.com:_authToken=XXXXXXXXX
always-auth=true
@react-admin:registry=https://registry.marmelab.com
//registry.marmelab.com:
_auth=XXXXXXXXX
email=software@XXXXXXXXX.com
always-auth=true
这是一个私人仓库,authTokens 目前硬编码在 .npmrc 文件中。
然而,在尝试为此寻找解决方案时,我确实看到了一位 Github 工作人员的随机评论:https://github.community/t/netlify-getting-401-from-github-package-registry-with-auth-token/16415/3
有点含糊,但听起来它不接受 .npmrc 文件中的硬编码 authToken。
所以我尝试的第一件事就是使用我们的环境变量,而不是像这样:
@xxxx=https://npm.pkg.github.com
//npm.pkg.github.com:_authToken=${NPM_AUTH_TOKEN}
我们的 Github 回购机密中的 env 变量是正确的,由工作流提供。
然而,这仍然导致相同的 401 未授权错误。
通过查看其他解决方案,我尝试在 install
步骤之前在 Github 操作中手动生成 .npmrc,如下所示:
- name: npmrcgen
run: |
echo "//npm.pkg.github.com/:_authToken=XXXXXXX" > .npmrc
echo "@xxxxx=https://npm.pkg.github.com/" >> .npmrc
echo "@react-admin:registry=https://registry.marmelab.com" >> .npmrc
echo "//registry.marmelab.com:" >> .npmrc
echo "_auth=XXXXXXX" >> .npmrc
echo "email=software@xxxxx.com" >> .npmrc
echo "always-auth=true" >> .npmrc
在我添加的日志记录步骤中,_authToken(仅适用于 Github)仍然显示为 ***
,我仍然收到 401 未授权错误。
此时我想确认 .npmrc 甚至被使用,所以我删除了我们用于 marmelab.com
的第二个私有注册表,果然,我得到一个错误,说它不再能够安装他们的 ra-realtime
包。这证明 .npmrc 文件确实被我的 Github 操作读取和使用,但它不接受我的 Github 个人访问令牌。
我也尝试生成一个新令牌。它可以完全访问 repo:
以及 write:packages
和 read:packages
下的所有内容,这是应该需要的。
在 Github 操作中仍然是 401 Unauthorized,并且在本地仍然可以正常工作。
最后我尝试用 yarn
而不是 npm
安装它。毫不奇怪,这也没有解决它。
我已经看到并尝试了以下解决方案,但均未成功:
- https://github.com/FerLuisxd/create-npmrc
- https://blog.bitsrc.io/install-npm-private-packages-in-ci-cd-with-github-actions-746db95017cc
有一件事我没有尝试过,因为我没有看到任何关于如何或这是一个好主意的建议,但我没有在 Github 操作中完成 npm login
。由于没有其他人这样做过,并且以某种方式使它起作用,我认为这是没有必要的。
我联系了 GitHub 支持,他们设法找出问题所在。
Github 工作流比本地环境更严格,需要在 auth 令牌前额外 /
:
找出不同之处:
//npm.pkg.github.com:_authToken=XXXXXXXXX. # broken
//npm.pkg.github.com/:_authToken=XXXXXXXXX # works
在 :_authToken=
之前添加额外的 /
解决了我的问题。
在项目的根目录中有一个 .npmrc 文件。
.npmrc 的内容:
registry=https://registry.npmjs.org/
@{scope}:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=********** (Token generated from github)
@{scope} 是您的组织名称或您的用户名。区分大小写。
像我一样在 GitHub 操作的上下文之外遇到此问题的任何其他人的附录:请注意 GitHub 包注册表使用 HTTP Basic Authentication. So if you're trying to test a personal access token 并且不想要要弄乱你的 .npmrc
/ .yarnrc
,你可以在注册表 URL 中传递凭据,例如用纱线:
yarn info "@<github-org>/<repo-name>" \
--registry="https://<github-user>:<token>@npm.pkg.github.com/"
或 curl
:
curl -vL 'http://<github-user>:<token>@npm.pkg.github.com/@<github-org>%2f<repo-name>'