扩展@Steve Roberts 的答案。
我的用户名采用“域\用户名”的形式 - 包括代理配置中的斜杠会导致出现正斜杠。所以输入这个:
npm config set proxy "http://domain\username:password@servername:port/"
我还必须对我的domain\user
字符串进行 URL 编码,但是,我的用户名中有一个空格,所以我放了一个+
来对空格 URL 编码进行编码,但它会被双重编码为%2B
(这是加号的 URL 编码,但是 URL空格的编码是%20
),所以我不得不改为执行以下操作:
npm 命令
// option one
// it works for some packages
npm config set http_proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
// option two
// it works best for me
// please notice that I actually used a space
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"
// option two (B) as of 2019-06-01
// no DOMAIN
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://user name:password@x.x.x.x:port"
npm config set proxy "http://user name:password@x.x.x.x:port"
故障排除 npm 配置
我使用npm config list
来获取我在上面设置的解析值,这就是我发现双重编码的方式。诡异的。
本质上,您必须弄清楚以下要求:
- 是
DOMAIN
验证所需的字符串
- 您需要对特殊字符进行编码吗?
问候。
WINDOWS 环境变量(CMD 提示)
更新
事实证明,即使使用上述配置,我仍然遇到一些使用Request - Simplified HTTP client在内部下载内容的包/脚本的问题。因此,正如上面的自述文件所解释的,我们可以在命令行上指定环境变量来设置代理,Request 将遵循这些值。
然后,在(我不愿意承认这一点)几次尝试(更像是几天)之后,尝试设置环境变量,我终于成功地遵循了以下准则:
rem notice that the value after the = has no quotations
rem - I believe that if quotations are placed after it, they become
rem part of the value, you do not want that
rem notice that there is no space before or after the = sign
rem - if you leave a space before it, you will be declaring a variable
rem name that includes such space, you do not want to do that
rem - if you leave a space after it, you will be including the space
rem as part of the value, you do not want that either
rem looks like there is no need to URL encode stuff in there
SET HTTP_PROXY=http://DOMAIN\user name:password@x.x.x.x:port
SET HTTPS_PROXY=http://DOMAIN\user name:password@x.x.x.x:port
cntlm
我使用上述技术几个星期,直到我意识到在所有需要代理设置的工具中更新密码的开销。
除了 npm,我还使用:
- 凉亭
- 流浪汉
- 虚拟盒子(运行linux)
- apt-get [Linux]
- 混帐
- 代码
- 括号
- 原子
- tsd
cntlm 设置步骤
所以,我安装了cntlm。设置cntlm
很简单,你寻找ini文件@C:\Program Files\Cntlm\cntlm.ini
- 打开
C:\Program Files\Cntlm\cntlm.ini
(您可能需要管理员权限)
- 寻找
Username
和Domain
线(我认为第 8-9 行)
在 cmd 提示符下运行:
cd C:\Program Files\Cntlm\
cntlm -M
cntlm -H
cygwin warning:
MS-DOS style path detected: C:\Program Files\Cntlm\cntlm.ini
Preferred POSIX equivalent is: /Cntlm/cntlm.ini
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
Password:
您从中获得的输出cntlm -H
将类似于:
PassLM 561DF6AF15D5A5ADG
PassNT A1D651A5F15DFA5AD
PassNTLMv2 A1D65F1A65D1ASD51 # Only for user 'user name', domain 'DOMAIN'
- 建议您使用 PassNTLMv2,因此添加
#
前行PassLM
或PassNT
不使用它们
- 将输出粘贴到
cntlm -H
ini 文件中,替换 、 和 的行PassLM
,PassNT
或PassNTMLv2
注释原始行并添加您的行。
- 添加您的
Proxy
服务器。如果您不知道代理服务器是什么...按照我的做法,我通过AutoConfigURL
在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
. 导航到该 url 并查看恰好是 JavaScript 的代码。
- 可选地,您可以通过更改
Listen ####
行来更改 cntlm 侦听的端口,####
端口号在哪里。
使用 cntlm 设置 NPM
所以,你将 npm 指向你的 cntml 代理,你可以使用我使用的 iplocalhost
和 cntlm 的默认端口,3128
所以我的代理 url 看起来像这样
http://localhost:3128
使用正确的命令:
npm 配置设置代理http://localhost:3128
简单了很多。您使用相同的 url 设置所有工具,并且只在一个地方更新密码。生活没有那么简单。
必须设置 npm CA 证书
来自 npm文档
如果您的公司代理使用自己的自签名证书拦截 https 连接,这是必须避免的npm config set strict-ssl false
(大禁忌)。
基本步骤
- 从浏览器获取证书(Chrome 运行良好)。将其导出为Base-64 编码的 X.509 (.CER)
- 将新行替换为
\n
- 编辑您的
.npmrc
添加行ca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"
问题
我注意到有时 npm 会挂起,所以我停止(有时是强制)cntlm并重新启动它。