无法发布到 NPM 注册表(本地)

Posted

技术标签:

【中文标题】无法发布到 NPM 注册表(本地)【英文标题】:Unable to publish to an NPM Registry (local) 【发布时间】:2017-01-20 11:13:05 【问题描述】:

我正在运行 Nexus 3.0.1-01,并使用它来托管 Maven 存储库和 NPM 注册表。对于 NPM,我有一个 npmjs.org 的本地镜像、一个本地 NPM 注册表和一个将两者结合在一起的组……

我一直在内部将它与 npm 一起使用,在那里我可以使用 npm-public 组作为我的注册表,并且运行良好。所以,我可以使用 Nexus 来镜像 npmjs。

下一步是采用本地编写的 npm 模块并将它们发布到 npm-releases(在我的 Nexus 实例上),以便这些模块可以在此处的交付团队之间共享。我已经能够构建一个包,并且 npm pack 似乎表现良好。

我已运行 npm adduser 以将我的 Nexus 凭据提供给我的 npm 环境。我使用登录 Nexus Web 应用程序时使用的相同用户名/密码,并且我的用户被分配了管理员角色(所以我应该拥有所有权限)。我可以在我的 .npmrc 文件中看到凭据

我的注册表值仍然是结合了镜像和我的本地注册表的 npm-public group。我已确保我尝试部署的模块的 package.json 有一个“publishConfig”部分,该部分指向本地注册表(不是公共组)的 url

然而,尽管如此,调用“npm publish”会导致 401 错误...

查看 npm-debug.log,我可以看到它正在尝试调用 HTTP PUT 调用以将组装的 tgz 文件推送到注册表,这将返回 401 错误

我在服务器的 shiro 包上启用了调试日志记录,但我只看到一条消息认为它需要身份验证

2016-09-13 08:56:28,590+1000 DEBUG [qtp1257823896-4030] *UNKNOWN org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter - Authentication required: sending 401 Authentication challenge response.

根据文档,我已经完成了我应该做的所有事情(npm add user),但我无法成功地将 npm 模块部署到我的本地存储库。

在调用 npm publish 时我需要使用其他选项吗?我需要对服务器中托管的 npm 存储库进行其他设置以允许我发布到它吗?我几乎使用默认值创建了它。我是否错过了阻止我部署到托管 npm 注册表的步骤?

任何帮助将不胜感激,因为我现在陷入困境。

【问题讨论】:

【参考方案1】:

事实证明,我的活动领域列表中没有 Npm Bearer Token Realm。将其移至 Active 后,发布成功完成!

【讨论】:

最近发布时出现 401 错误。确认:使用最新版本的解决方案:Nexus OSS 3.9.0-01 和 Node.js 9.8.0。但是如果使用 nginx 反向代理: nginx.config 错误配置可能会破坏身份验证。查看books.sonatype.com/nexus-book/3.0/reference/…了解更多详情 解决方案总结:启用Npm Bearer Token Realm和"publishConfig": "registry": "https://your-nexus-host/nexus/repository/npm-private/" npm config set registry https://your-nexus-host/nexus/repository/npm-group/ npm adduser --registry=https://your-nexus-host/nexus/repository/npm-private/ ( provide nexux-user-name, nexux-user-password, nexux-user-email) npm publish . 这个解决方案还帮助我让 NuGet 推送工作(只需添加 Nuget API-Key Realm)【参考方案2】:

除了@EdH 的回答,我们发现 .npmrc 的格式发生了变化,因此 base64 编码的 _auth 将不再起作用......并且必须通过登录到 repo 来创建令牌。

旧的.npmrc

registry=https://host/repo
_auth=12afdjsljl123213

新的.npmrc

//host/repo/:_authtoken=uuidOfToken

【讨论】:

注意:当您通过 npm login 登录时,npm 将在您的 global ~/.npmrc 文件中添加一个条目。在那里,您可以找到 base64 编码的令牌,您可以将其复制到本地 .npmrc 或在 CI 管道中生成。【参考方案3】:

除了@Daniel 的回答,我发现当adding user credentials/logging into npm 时,注册表网址上不能有斜杠。

不好:

npm adduser --registry=https://repo.localhost/repository/npm-internal/

好:

npm adduser --registry=https://repo/repository/npm-internal

此外,如果您希望自动登录(即非交互式),我使用了一个名为 npm-cli-login 的好工具。

npm-cli-login -u admin -p admin123 -e nick@foo.bar -r https://repo/repository/npm-internal

【讨论】:

请注意,在最新版本的 npm 中,为了使用 Basic Auth 登录 Nexus,您需要在“npm adduser”命令中添加“--auth-type-legacy”参数. 这实际上是不正确的,因为从注册表中删除尾部斜杠会导致 npm 忽略最后一个路径段(错误?)【参考方案4】:

我意识到这篇文章已经有几年的历史了,但是在为这个问题苦苦挣扎了好几个小时之后,我终于找到了对我有用的东西,这是我在许多其他地方都没有看到的。问题是我没有在.npmrc 文件中指定_authToken。如下所示添加这个解决了这个问题,我能够成功运行 npm 命令而没有 401 错误。

.npmrc

registry=https://test.repo.com/repository/npm-group/
//test.repo.com/repository/npm-group/:_authToken=NpmToken.$NPM_TOKEN

【讨论】:

【参考方案5】:

您可能会收到此类错误的另一个原因是您可能为“npm Bearer Token Realm”启用了对服务器的匿名访问。禁用匿名访问后,您还必须删除 .npmrc 并重新添加注册表和 adduser。

【讨论】:

以上是关于无法发布到 NPM 注册表(本地)的主要内容,如果未能解决你的问题,请参考以下文章

Npm pack 包含本地模块

Azure Devops:即使在设置 NPM Authenticate 之后,也无法使用 NPM 私有注册表构建映像

如何 npm 发布到 Nexus 组存储库?

JFrog私有注册表无法npm安装

对npm的认识

无法使用托管在 GPR 上的私有 NPM 包