具有对私有存储库只读访问权限的GitHub访问令牌

62

我有一个项目依赖于私有的Git仓库,其中使用了Node。我需要能够运行npm install而不会被提示输入密码或允许SSH连接,因此我在我的package.json中使用了我在GitHub上创建的访问令牌:

  "dependencies": {
    "sass-theme": "git+https://[token]:x-oauth-basic@github.com/MyOrg/sass-theme.git#v1.0.2",
    "node-sass": "^4.5.0"
  }

这个项目与其他几十个人分享,所以我显然不想在源代码控制中保留我的令牌。我知道我可以在GitHub上创建一个只读的部署密钥,但我认为这需要其他开发人员导入SSH密钥才能本地构建项目。

是否有可能创建一个可共享但只具备克隆存储库的只读访问权限的访问令牌?


与http://stackoverflow.com/questions/42634896/maven-build-step-to-install-node-package-from-private-repository相关的编程内容。 - Big McLargeHuge
1
自2015年以来,这个问题一直存在:https://github.com/jollygoodcode/jollygoodcode.github.io/issues/6 我不知道为什么他们不修复它。相比之下,GitLab确实有只读访问令牌。 - Erel Segal-Halevi
5个回答

38
我能想到最简单的方法来创建一个可读取私有代码库的令牌是:
  1. 使用只有读取指定私有代码库访问权限的用户(最好没有其他权限)
  2. 以该用户身份创建具有“repo”范围的个人访问令牌
最好不要给予该用户对其他机构/代码库的访问权限,因为“repo”范围会授予该用户对其拥有写入访问权限的所有代码库的完全控制权。 在企业解决方案中,我们可能会使用System ID进行此操作,但在GitHub上,您可以创建一个“Machine User”。参考:Machine User

1
这似乎相当简单。结合起来,我们可能需要在每个开发者的机器上设置一个包含密钥的环境变量(以避免将其放入源代码控制中)。 - Big McLargeHuge
没错,因为该令牌仍可能对将其添加为贡献者的其他项目造成损害,并且您可以使用该令牌登录。 - Al Neill
7
协作者无法获得私有代码库的只读访问权限,您必须授予他们写入权限。 - Herbert
2
关于Herbert的评论的澄清:如果私有仓库在组织内部,您可以指定要向协作者提供哪种访问权限。以下是文档链接:https://docs.github.com/en/rest/reference/collaborators#add-a-repository-collaborator - monfresh
3
GitHub默认不提供对私有仓库只读访问权限,这一事实相当荒谬。现在我必须支付额外的用户费用才能授予这种类型的访问权限。 - shoke
GitHub现在拥有细粒度令牌,允许此级别的访问。 - Brandon Rose MD MPH

17

部署密钥是最好的选择。默认情况下,它们不允许写入访问,并且它们仅限于特定存储库(与GitHub个人访问令牌不同)。因此,您现在可以生成私钥/公钥对,在GitHub的单个存储库上设置一个只读取/提取的部署密钥,然后在您的CI中使用私钥。

例如运行一个bash脚本:

eval "$(ssh-agent -s)";
ssh-add <your private deploy key>;

现在您的 CI 在构建过程中可以访问私有仓库。

您可以前往 Github 上的存储库,然后点击 Settings > Deploy keys > Add deploy key 添加部署密钥。


13
部署密钥很好用,但据我所知,它们只能用于SSH访问 - 无法用于HTTPS访问。在仅允许使用HTTPS通信的环境中,这将是无用的。 - pabouk - Ukraine stay strong
4
@pabouk 说得好,部署密钥是一个SSH密钥。 - Sebastiaan

1
如果你认为在源代码中放置凭据是一个糟糕的主意(正如你应该这样做!),那么你有以下几个选择:
  1. 将其存储在私有GitHub存储库中,但将其他数十个人作为此存储库的协作者添加到其中(只具有只读访问权限)。
  2. 将其存储在私有GitHub存储库中,但作为组织拥有,并将这些人添加到组织中。
  3. 发布为私有npm模块。
  4. 在私有npm注册表中发布。
  5. 在需要它的程序的源代码中包含依赖项。
最后一种方法基本上就像在使用该模块的原始代码中包含node_modules,所以当然不美观。托管自己的npm注册表并不容易,但您可以通过这种方式自动添加用户。发布私有npm模块是不免费的。维护一个组织,其中充满了应该能够访问您的存储库的人,是很麻烦的。
请记住一件事:如果您与多个人共享凭据,则每个人最终都将有权访问,这只是时间问题。这些凭据可能具有有限的范围,例如只读部署密钥或受限制访问权限的机器用户,但如果它被分发,它最终会泄漏,特别是当您与数十个人分享时。最好保留可以访问代码的人员列表,并可以使用GitHub API自动更新该列表。
我永远不会建议在项目的源代码中分发凭据,无论这些凭据提供了多么有限的访问权限。

2
  1. 即使是协作者也会被提示输入密码或允许SSH连接。如果可能的话,我想避免这种情况。
  2. 这就是当前的设置方式。请参见1。 3-5) 你已经提到了为什么这些都不是理想的选择,我同意。
- Big McLargeHuge

1

没有私有仓库只读访问权限的范围是很丑陋的。

我的建议是创建一个新的令牌,即使是带有读写权限的临时令牌。然后拉取/获取更改并直接删除令牌。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接