Verdaccio 推荐方案和包的隐私保护
推荐方案
以下指南列出了收集的最佳做法,我们通常建议所有用户这样做。
不要将本指南视为强制性的,您可以根据需要选择其中一些。
私人注册
您可以添加用户并管理哪个用户可以访问哪个包。
建议您为私有软件包定义一个前缀,例如 local-*
或作用域 @my-company/*
,这样所有私有事物都将如下所示:local-foo
通过这种方法您可以清楚地把公有包和私有包分开。
packages:
'@my-company/*':
access: $all
publish: $authenticated
'local-*':
access: $all
publish: $authenticated
'@*/*':
access: $all
publish: $authenticated
'**':
access: $all
publish: $authenticated
永远记住,软件包访问的顺序很重要,软件包始终从上到下进行处理。
从 npmjs.org 使用公有包
如果一些包没有在存储里,服务器将试着从 npmjs.org 中取它。 如果 npmjs.org 坏了,它会假装没有其他的包存在,并起到缓存包的作用。
Verdaccio 将仅下载所需的内容(= 客户端请求),并且此信息将被缓存,因此,如果客户端第二次询问相同的内容,则无需询问 npmjs.org 就可以提供服务。
例:
如果您 express@4.0.1 一次成功地从该服务器请求,即使 npmjs.org 处于关闭状态,您也可以在任何时候再次执行此操作(包含所有依赖项)。
但是,要说 express@4.0.0 到有人真正需要它,才能下载。并且,如果 npmjs.org 处于脱机状态,则该服务器将仅发布 express@4.0.1(= 仅缓存中的内容),而不会发布其他任何内容。
覆盖公共包
如果您想使用某个公共软件包的修改版本 foo
,则可以将其发布到本地服务器上,因此在键入时 npm install foo
,它将考虑安装您的版本。
这里有两个选项:
-
- 您要创建一个单独的派生并停止与公共版本同步。
如果您希望这么做,您应该修改配置文件,这样 verdaccio 将不再向 npmjs 提出此包的请求。
为此包添加一个单独的条目到 config.yaml 并从代理列表中删除 npmjs 并重新启动服务器。
packages:
'@my-company/*':
access: $all
publish: $authenticated
# comment it out or leave it empty
# proxy:
在本地发布软件包时,您可能应该使用比现有版本更高的版本字符串开头,这样它就不会与缓存中的现有软件包冲突。
-
- 您希望临时使用自己的版本,但在它更新后立即切换回公共版本。
为了避免版本冲突,您应该使用下一个补丁版本的自定义预发行后缀。例如,如果公共软件包的版本为 0.1.2,则可以上载 0.1.3-my-temp-fix
。
npm version 0.1.3-my-temp-fix
npm --publish --tag fix --registry http://localhost:4873
这样,您的软件包将一直使用,直到其原始维护者将其公共软件包更新为为止 0.1.3
。
安全
安全始于您的环境,为此,我们完全建议您阅读 10 npm Security Best Practices 并遵循建议。
包的访问
默认情况下,您在 Verdaccio 中发布的所有软件包都可供所有公众访问,我们完全建议保护您的注册表,防止外部非授权用户将 access
属性更新为 $authenticated
。
packages:
'@my-company/*':
access: $authenticated
publish: $authenticated
'@*/*':
access: $authenticated
publish: $authenticated
'**':
access: $authenticated
publish: $authenticated
这样,除非获得授权并且私有软件包不会在用户界面中显示,否则没有人会提前进行注册。
服务器
安全连接
使用 HTTPS 是一个常见的建议,出于这个原因,我们建议您阅读 SSL 部分以确保 Verdaccio 的安全,或者在 Verdaccio 之上使用 HTTPS 反向代理。
令牌过期
在 verdaccio@3.x
令牌中没有到期日期。因此,我们在下一个介绍 verdaccio@4.x
了 JWT 功能 PR#896
security:
api:
jwt:
sign:
expiresIn: 15d
notBefore: 0
web:
sign:
expiresIn: 7d
使用此配置将覆盖当前系统,并且您将能够控制令牌的有效期。
使用 JWT 还可以提高身份验证插件的性能,旧系统将执行解包并验证每个请求中的凭据,而 JWT 将依靠令牌签名来避免插件的开销。
附带说明一下,在 npmjs 上,令牌永不过期
包的隐私保护
verdaccio 允许您保护发布,以达到需要正确设置软件包访问权限的目的。
包配置
例如,让我们一起来看以下设置。 您有一组前缀为 my-company-*的依赖项,您要保护它们不让匿名或另一个没有正确证书的已登录用户使用。
'my-company-*':
access: admin teamA teamB teamC
publish: admin teamA
proxy: npmjs
使用此配置,基本上,我们允许组 admin 和 teamA 发布和 teamS teamS teamS 访问此类依赖项。
用例:teamD 试着访问此依赖项
因此,如果我以 teamD 身份登录。 我不应该能够访问与 my-company- *模式匹配的所有依赖项。
➜ npm whoami
teamD
我将无法访问此类依赖项,也不会通过网络显示给用户 teamD。 如果我尝试访问,则会发生以下情况。
➜ npm install my-company-core
npm ERR! code E403
npm ERR! 403 Forbidden: webpack-1@latest
或者用 yarn
➜ yarn add my-company-core
yarn add v0.24.6
info No lockfile found.
[1/4] 🔍 Resolving packages...
错误出现意外错误:"http://localhost:5555/webpack-1: 不允许未注册用户访问 my-company-core 包"。