53

语境

  1. 我的.npmrc文件似乎已正确读取(npm config ls -l通过命令行和 Maven 构建进行检查)。

  2. 运行的机器npm无法直接连接到网络,它只能连接到 Nexus npm 注册表 url。因此,代理属性proxyhttps-proxy没有设置。

  3. 由于对 Nexus 的访问受到限制,我从 Nexus 中生成了一个访问令牌。

  4. Nexus 安全令牌由用户名和密码组成,两者都包含/通常必须是“url 编码”的字符

  5. 正如预期的那样,使用此配置,运行时npm install未检测到代理。

  6. Nexus npm 注册表代理似乎设置正确(使用生成的令牌连接后,我可以使用 Web 浏览器访问json文件和下载文件)tgz

  7. 如果我设置registryhttp://registry.npmjs.org/注释_auth, email, always-auth,strict-ssl属性以及添加proxyhttps-proxy配置,npm install则按预期工作(但我将无法在目标环境中执行此操作)

.npmrc文件内容

; Nexus proxy registry pointing to http://registry.npmjs.org/
registry = https://<host>/nexus/content/repositories/npmjs-registry/ 

; base64 encoded authentication token
_auth = <see question below>

; required by Nexus
email = <valid email>

; force auth to be used for GET requests
always-auth = true

; we don't want to put certificates in .npmrc
strict-ssl = false

loglevel = silly

问题

我应该如何_auth正确生成属性才能npm install按预期工作?

我试过到目前为止

  1. base64编码(<username>:<password>
    • 结果是npm info retry will retry, error on last attempt: Error: socket hang up
  2. base64Encode(urlencode( <username>:<password>))
    • 结果是npm info retry will retry, error on last attempt: Error: This request requires auth credentials. Run `npm login` and repeat the request.
  3. base64Encode(urlencode( <username>)) :urlencode( <password>))
    • 结果是npm info retry will retry, error on last attempt: Error: socket hang up

收到socket hang up错误时,我有以下堆栈跟踪:

http request GET https://<host>/nexus/content/repositories/npmjs-registry/fsevents
sill fetchPackageMetaData Error: socket hang up
sill fetchPackageMetaData     at TLSSocket.onHangUp (_tls_wrap.js:1035:19)
sill fetchPackageMetaData     at TLSSocket.g (events.js:260:16)
sill fetchPackageMetaData     at emitNone (events.js:72:20)
sill fetchPackageMetaData     at TLSSocket.emit (events.js:166:7)
sill fetchPackageMetaData     at endReadableNT (_stream_readable.js:905:12)
sill fetchPackageMetaData     at doNTCallback2 (node.js:441:9)
sill fetchPackageMetaData     at process._tickCallback (node.js:355:17)
sill fetchPackageMetaData  error for fsevents@^1.0.0 { [Error: socket hang up] code: 'ECONNRESET' }
WARN install Couldn't install optional dependency: socket hang up
verb install Error: socket hang up
verb install     at TLSSocket.onHangUp (_tls_wrap.js:1035:19)
verb install     at TLSSocket.g (events.js:260:16)
verb install     at emitNone (events.js:72:20)
verb install     at TLSSocket.emit (events.js:166:7)
verb install     at endReadableNT (_stream_readable.js:905:12)
verb install     at doNTCallback2 (node.js:441:9)
verb install     at process._tickCallback (node.js:355:17)

收到This request requires auth credentials错误时,我有以下堆栈跟踪:

npm sill fetchPackageMetaData Error: This request requires auth credentials. Run `npm login` and repeat the request.
npm sill fetchPackageMetaData     at CachingRegistryClient.authify (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\authify.js:17:14)
npm sill fetchPackageMetaData     at CachingRegistryClient.makeRequest (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:103:17)
npm sill fetchPackageMetaData     at <root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:66:17
npm sill fetchPackageMetaData     at RetryOperation._fn (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\attempt.js:18:5)
npm sill fetchPackageMetaData     at null._onTimeout (<root>\ui\target\node\node_modules\npm\node_modules\retry\lib\retry_operation.js:49:10)
npm sill fetchPackageMetaData     at Timer.listOnTimeout (timers.js:92:15)
npm sill fetchPackageMetaData  error for fsevents@^1.0.0 [Error: This request requires auth credentials. Run `npm login` and repeat the request.]
npm WARN install Couldn't install optional dependency: This request requires auth credentials. Run `npm login` and repeat the request.
npm verb install Error: This request requires auth credentials. Run `npm login` and repeat the request.
npm verb install     at CachingRegistryClient.authify (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\authify.js:17:14)
npm verb install     at CachingRegistryClient.makeRequest (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:103:17)
npm verb install     at <root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:66:17
npm verb install     at RetryOperation._fn (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\attempt.js:18:5)
npm verb install     at null._onTimeout (<root>\ui\target\node\node_modules\npm\node_modules\retry\lib\retry_operation.js:49:10)
npm verb install     at Timer.listOnTimeout (timers.js:92:15)

提前致谢。

4

6 回答 6

56

https://books.sonatype.com/nexus-book/reference/npm-deploying-packages.html

$ echo -n 'username:password' | openssl base64
于 2017-03-25T05:19:21.280 回答
13

如果您有授权令牌,则不应使用用户名:密码。我建议你:

  1. 生成令牌

    • 删除你的 ~/.npmrc 或重命名它。
    • 确保您的环境设置(如 $NPM_CONFIG_*)未设置。
    • 使用以下方法验证电子邮件和其他设置是否未设置:npm config list
    • 使用以下命令登录到 npm:npm login --registry=https://nexus.whatever.registry/respository/npm-whatever-group/
    • 登录后 - 您已登录。npm 应该在你的 ~/.npmrc 中为它生成一个令牌。它看起来像:

//nexus.whatever.registry/respository/npm-whatever-group/:_authToken=NpmToken.YOUR-LOVELY-TOKEN-IN-HEX

  1. 您可以在项目、CI 管道和其他项目中使用该令牌。确保在您的项目 .npmrc 中有:

//nexus.whatever.registry/respository/npm-whatever-group/:_authToken=NpmToken.YOUR-LOVELY-TOKEN-IN-HEX email = <EMAIL_USED_FOR_TOKEN_GENERATION> always-auth = true registry = https://nexus.whatever.registry/respository/npm-whatever-group/

  1. 如果您在身份验证/证书方面遇到问题:

    • 添加环境变量(也添加到您的 CI/CD 管道) $NODE_EXTRA_CA_CERTS 以指向 /home/wherever/is/your/cert.pem
  2. 对于 CI/CD 管道(如 gitlabs 或 jenikins):

    • 考虑将 .npmrc 项目文件中的实际值替换为${RELEVANT_ENV_VARIABLES}. 这样,您将使它们不那么明显,并且始终在管道更改时自动更新。

希望这有帮助。

于 2019-09-27T09:32:20.710 回答
7

查看registry-client代码后,我找到了答案,就是这里。我发布它是因为它可以帮助其他人:

base64Encode(<username>:<password>)

顺便说一句,有一个 URL 编码,但它authify.js负责处理它。

我面临的“套接字挂起”问题是由于如果在 Windows 配置中设置了代理,当npm从 CLI(而不是从 Maven 构建)启动时,所有 `.npmrc` 代理设置似乎当 npm 忽略本机代理排除(用于公司 URL)时,将被忽略。我会开票报告这种奇怪的行为。

于 2016-01-27T18:01:52.630 回答
7
Before you run npm login, please follow the instructions below :

1) Create an ~/.npmrc file with the following contents:

registry=https://example.com/repository/npm-group/
email=username@example.com
always-auth=true
//example.com/repository/npm-group/:_authToken=

2) run `npm login`

# npm login
Username: firstname.lastname
Password: 
Email: (this IS public) firstname.lastname@example.com
Logged in as firstname,lastname on https://example.com/repository/npm-group/.

Use the same password you use to login to example.com
于 2019-07-22T10:44:38.980 回答
2

我不了解 Nexus,但我们使用 artifactory 作为 npm 存储库,在那里我可以通过调用从我的个人 artifactory 配置文件中获得的那个来创建我的身份验证base64encode(username:encryptedPassword)令牌encryptedPassword

也许这有帮助。

于 2016-10-12T14:46:21.077 回答
0

我刚刚编写了一个包装器,将凭据存储在您的系统钥匙串中并即时提供它们。查看:https ://github.com/Xiphe/npm_keychain_auth

于 2018-11-02T01:12:02.497 回答