Как мне установить _auth в .npmrc при использовании прокси-сервера Nexus https npm?

Контекст

  • Мой файл .npmrc кажется правильно прочитанным (отмечен с помощью npm config ls -l как из командной строки, так и из сборки Maven).

  • машина, на которой выполняется npm, не может напрямую подключаться к сети, она может подключаться только к URL-адресу реестра Nexus npm. Поэтому свойства прокси-сервера proxy и https-proxy не заданы.

  • Поскольку доступ к Nexus ограничен, я создал токен доступа из Nexus.

  • Знаки безопасности Nexus сделаны из имени пользователя и пароля, которые содержат символы типа /, которые обычно должны быть "закодированы по URL"

  • как и ожидалось, с этой конфигурацией при запуске npm install не обнаруживает прокси.

  • Прокси-сервер Nexus npm, по-видимому, настроен правильно (я могу как обращаться к файлам json, так и загружать файлы tgz с помощью веб-браузера после подключения с использованием созданного токена)

  • Если я устанавливаю registry в http://registry.npmjs.org/ и комментирую _auth, email, always-auth, strict-ssl свойства и добавляю конфигурацию proxy и https-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 работал как ожидалось?

Я пробовал до сих пор

  • base64Encode (<username>:<password>)
    • приводит к npm info retry will retry, error on last attempt: Error: socket hang up
  • 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.
  • 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 [email protected]^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 [email protected]^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)

Спасибо заранее.

Ответ 1

После просмотра кода registry-client я нашел ответ, вот он. Я отправляю его, поскольку это может помочь другим людям:

base64Encode(<username>:<password>)

Кстати, есть URL-кодировка, но она authify.js, которая позаботится об этом.

Проблема "зависания сокета", с которой я столкнулась, связана с тем, что если прокси установлен в конфигурации Windows, при запуске npm из CLI (а не из сборки Maven) все `` `.npmrc `` Параметры прокси-сервера, похоже, игнорируются, а собственные прокси-исключения (для корпоративных URL-адресов) игнорируются npm. Я открою билет, чтобы сообщить об этом странном поведении.

Ответ 3

Я не знаю о Nexus, но мы используем artifactory в качестве ретрансляции npm, и там я могу создать свой токен аутентификации, вызвав base64encode(username:encryptedPassword) с encryptedPassword тем, что я получаю от своего личного профиля artifactory.

Возможно, это помогает.

Ответ 4

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 protected]
always-auth=true
//example.com/repository/npm-group/:_authToken=

2) run 'npm login'

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

Use the same password you use to login to example.com

Ответ 5

Я только что написал оболочку, которая хранит учетные данные в вашей системной цепочке для ключей и предоставляет их на лету. Проверьте: https://github.com/Xiphe/npm_keychain_auth

Ответ 6

Если у вас есть токен авторизации, вы не должны использовать имя пользователя: пароль. Я предлагаю вам:

  1. Создать токен

    • Удалите ~/.npmrc или переименуйте его.
    • Убедитесь, что настройки env, такие как $ 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. Если у вас есть проблемы с аутентификацией/сертификатами:

    • добавить переменную env (также в вашу линию CI/CD) $ NODE_EXTRA_CA_CERTS для указания на /home/wherever/is/your/cert.pem
  2. Для конвейеров CI/CD (например, gitlabs или jenikins):

    • рассмотрите возможность замены фактических значений из файла проекта .npmrc на ${RELEVANT_ENV_VARIABLES}. Таким образом, вы сделаете их менее заметными и всегда будете обновляться при смене pipeопровода.

Надеюсь, это поможет.