Подтвердить что ты не робот

Npm за прокси-сервером не работает со статусом 403

Я пытаюсь запустить npm за прокси. Я попробовал войти в прокси напрямую или через Authoxy:

npm config set proxy http://localhost:8999
npm config set https-proxy http://localhost:8999

Независимо от того, какой прокси я использую, я всегда получаю ту же ошибку при запуске npm search:

npm info it worked if it ends with ok
npm verb cli [ 'node', '/usr/local/bin/npm', 'search' ]
npm info using [email protected]
npm info using [email protected]
npm verb config file /Users/xxx/.npmrc
npm verb config file /usr/local/etc/npmrc
npm verb config file /usr/local/lib/node_modules/npm/npmrc
npm WARN Building the local index for the first time, please be patient
npm verb url raw /-/all
npm verb url resolving [ 'https://registry.npmjs.org/', './-/all' ]
npm verb url resolved https://registry.npmjs.org/-/all
npm info retry registry request attempt 1 at 09:48:47
npm http GET https://registry.npmjs.org/-/all
npm info retry will retry, error on last attempt: Error: tunneling socket could not be established, sutatusCode=403
npm info retry registry request attempt 2 at 09:48:57
npm http GET https://registry.npmjs.org/-/all
npm info retry will retry, error on last attempt: Error: tunneling socket could not be established, sutatusCode=403
npm info retry registry request attempt 3 at 09:49:57
npm http GET https://registry.npmjs.org/-/all
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR!     at ClientRequest.onConnect (/usr/local/lib/node_modules/npm/node_modules/request/tunnel.js:148:19)
npm ERR!     at ClientRequest.g (events.js:185:14)
npm ERR!     at ClientRequest.EventEmitter.emit (events.js:115:20)
npm ERR!     at Socket.socketOnData (http.js:1383:11)
npm ERR!     at TCP.onread (net.js:410:27)

Команда всегда терпит неудачу с sutatusCode [sic!] 403, что означает несанкционированный доступ. Я установил Authoxy, чтобы не требовать имя пользователя/пароль. Такая же ошибка возникает, когда я обходит Authoxy и предоставляю реальные учетные данные прокси для нашего прокси-сервера NTLM в виде http://user: pass @proxy: port.

Как я могу выполнить эту работу через прокси?

Обновление

Я создал проблему в проекте NPM, чтобы сообщить об этом: https://github.com/isaacs/npm/issues/2866

4b9b3361

Ответ 1

Итак, через несколько минут после публикации вопроса я сам нашел ответ здесь: https://github.com/npm/npm/issues/2119#issuecomment-5321857

Кажется, проблема в том, что npm не так хорош с HTTPS через прокси. Изменение URL-адреса реестра с HTTPS на HTTP исправило это для меня:

npm config set registry http://registry.npmjs.org/

Я все еще должен предоставить конфигурацию прокси (через Authoxy в моем случае), но теперь все работает нормально.

Кажется, это общая проблема, но недостаточно хорошо задокументирована. Я надеюсь, что этот ответ поможет людям найти, сталкиваются ли они с этой проблемой.

Ответ 3

Если вам необходимо указать имя пользователя и пароль для аутентификации в вашем прокси, это синтаксис для использования:

npm config set proxy http://usr:[email protected]:port
npm config set https-proxy http://usr:[email protected]:port

Ответ 4

Если кто-то еще завершит нарушение своих настроек конфигурации прокси, перейдите в свой .npmrc, чтобы ввести настройки. Этот файл находится на уровне корневой папки node.

Вот что выглядит мой исправленный файл:

#proxy = http://proxy.company.com:8080
https-proxy = https://proxy.company.com:8080 
registry = http://registry.npmjs.org/

Ответ 5

Для тех, кто использует Jenkins или другой сервер CI: важно, где вы определяете свои прокси, особенно когда они отличаются в вашей локальной среде разработки и среде CI. В этом случае:

  • не определяйте прокси в файле проекта .npmrc. Или, если вы это сделаете, не забудьте переопределить настройки на сервере CI.
  • любые другие настройки прокси-сервера могут вызвать 403 Forbidden с небольшим намеком на то, что вы используете неправильный прокси-сервер. Проверьте свои gradle.properties и т.д. И исправьте /gradle.properties при необходимости.

TL;DR: определить прокси не в проекте, а на машине, на которой вы работаете.