放置Git个人访问令牌的位置应该在哪里?

366

在GitHub生成个人访问令牌后,是否有必要将其存储在本地?

如果是,有没有任何首选的存储方式?


8
把您的令牌视为密码并保密。在使用API时,将令牌作为环境变量而不是硬编码到程序中。请参见官方文档中的第8项:https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/ - Saugat
9
我看到了生成访问令牌时的评论,但我不确定人们在实践中如何保护它们的安全。 - Krzysztof Słowiński
112
这对我来说似乎很奇怪。密码的一半意义在于(理想情况下)你要记住它们,然后系统会将其哈希处理,因此它们永远不会以明文形式存储。然而,GitHub的个人访问令牌系统似乎基本上强制您以明文形式存储令牌? - user56reinstatemonica8
27
它们是自动生成的,又很长,所以记忆它们不是一个选择。 - Krzysztof Słowiński
39
GitHub似乎刚刚禁用了“git push”的密码认证,并强制使用令牌。现在我们必须明文存储令牌或使用凭据助手为您存储它。无论哪种情况,访问您计算机的人现在具有对您的存储库的写访问权限。-回想起以前我只需使用每次都要输入的密码时,这种特定的安全风险不存在。而且不要忘记,知道我的密码的人可以轻松地使用它来创建自己的令牌。因此,就安全性而言,除非GitHub也决定强制2FA,否则我们不会得到任何收益。 - Forivin
显示剩余5条评论
16个回答

243
密码的一半意义在于(理想情况下)你记住它们,系统对它们进行哈希处理,因此它们从未以明文存储。然而,GitHub的个人访问令牌系统似乎基本上强制你将令牌以明文形式存储?首先,PAT(个人访问令牌)不是简单的密码,而是一个等价的东西:你可以生成多个(例如,每台需要访问GitHub存储库的计算机一个),你可以随时撤销它(从GitHub Web界面),这使得那个PAT过时了,即使它在其中一台机器上继续存在。这与您的密码不同,后者是唯一的,不能轻易更改,否则必须同时在您使用它的所有地方进行修改。

由于PAT可用于在命令行或API上使用Git时代替密码,因此您可以使用git凭据助手来安全地缓存它。
例如,在Windows上,可以通过Windows凭据管理器使用GCM - 适用于Windows、Mac或Linux的Git凭据管理器

git config --global credential.helper manager-core
# Git 2.39+
git config --global credential.helper manager

(manager-core将被替换为/重命名为Git 2.39+的< strong> manager , Q4 2022)

第一次推送到存储库时,会弹出一个窗口询问您的凭据:用户名您的PAT。
下一次,它不会询问,并直接重用该PAT,该PAT仍然安全地存储在您的凭据管理器中。

类似的想法适用于带有OSX钥匙串的Mac和Linux与GNOME Keyring(在2021年,它将需要一个DBus会话和libsecret),但在2021年,GCM-Core涵盖了这些用例。
这个想法仍然是:在加密的凭据存储中存储PAT。


如上所述,更现代的解决方案(Q4 2020)为Microsoft Git-Credential-Manager-Core,或者在Q4 2022年为Microsoft Git-Credential-Manager
git config --global credential.helper manager-core
# Git 2.39+:
git config --global credential.helper manager

在 Git 2.39 (2022年第4季度) 之前,对于 Linux:

您需要安装 git-credential-manager-core,下载其 最新版本, 如 gcmcore-linux_amd64.2.0.474.41365.deb

sudo dpkg -i <path-to-package>
git-credential-manager-core configure

尽管如此,在Linux上使用GCM(Git-Credential-Manager-Core),如Mekky Mayata评论中所述,您需要首先定义git config --global credential.credentialStore
请参见“Linux上的凭据存储”:

GCM在Linux平台上管理的凭据存储有四个选项:

默认情况下,GCM未配置。
您可以通过设置GCM_CREDENTIAL_STORE环境变量或credential.credentialStore Git配置设置来选择要使用的凭据存储。

正如agent18评论中所指出的那样,在安装了libsecret-1-0libsecret-1-dev之后,使用git-credential-libsecret是一个不错的第一步。
但是,在Git 2.39之前,这应该现在被credential-manager-core所包含。

3
你提供的 GNOME Keyring 解决方案对于 Ubuntu 20.04 不起作用,因为该套件中没有 libgnome-keyring-dev 软件包。这是你所说的 Linux 支持尚未完全实现的意思吗?有什么推荐的解决方法,并且我在哪里可以查看所做的进展? - Mxt
2
@Mxt GCM-Core 现在支持 Linux(https://github.com/microsoft/Git-Credential-Manager-Core/blob/master/docs/linuxcredstores.md),因此它现在是官方的解决方法。 - VonC
2
git push 后,最后两行给了我以下错误: /var/tmp/.net/user/git-credential-manager-core/unqypyc0.awl/git-credential-manager-core get: 1: /var/tmp/.net/user/git-credential-manager-core/unqypyc0.awl/git-credential-manager-core: not found - Ilya Palachev
1
在Linux上运行以上命令时,一切正常,但我收到了“fatal: No credential backing store has been selected.”的错误提示。通过编辑git配置文件git config -e --global并向其中添加一个credentialStore值(明文、gpg、secretservice),问题得以解决。 感谢@VonC。 - Mekky_Mayata
1
所以,基本上,如果我丢失了我的秘密令牌,我随时可以使用我的密码登录到Web界面并生成新的令牌? - TheEagle
显示剩余30条评论

240

在我的情况下,在Ubuntu操作系统中,原本被接受的解决方案无效,并显示如下信息:

git: 'credential-manager' is not a git command

但是,使用 store 而不是 manager 可以很好地解决问题:

git config --global credential.helper store

34
仅做补充说明 - 在启用此功能后,您将在下一次提交时被提示输入您的凭证。之后,它们将被存储。 - D3l_Gato
74
这似乎会将您的令牌以明文形式存储在 ~/.git-credentials 文件中。 - Stanley Bak
9
当有人发出警告后,提供至少一个链接真的很有帮助。请点击这里获取关于如何“安全”地存储个人访问令牌(PAT)并使用Git工作流程的卓越指导,只需3行代码。 - agent18
6
小提示:如果您只想将此配置应用于特定的仓库,请删除“--global”。 - Joao Vitorino
经过很多折腾,我最终使用了Github的SSH而不是HTTP(https://docs.github.com/en/authentication/connecting-to-github-with-ssh)。 - Vahid Pazirandeh
这样做的作用是设置Git在下次推送时存储个人访问令牌,所以如果它不直接要求个人访问令牌,这是正常的。下次推送时,您仍然需要指定个人访问令牌,但之后的推送将不再需要。 - undefined

44

或者,您可以在主目录中创建一个~/.netrc文件,并将登录凭据保存到其中。

cat ~/.netrc
machine github.com login <login-id> password <token-password>

12
请提供详细的解释,以便下一个用户更好地理解您的答案。 - Elydasian
4
这个方法很实用,行之有效。点赞。对我来说,答案已经很清晰了。 - jpmag
2
该链接详细解释了netrc文件及其与inetutils的关联。https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html - zrash
2
@JwalaKumar 只需在您的 Linux 主目录中创建一个名为 .netrc 的文件,并将其内容设置为答案中所示。如果您使用的是 Windows,请尝试以下方法 https://dev59.com/i2025IYBdhLWcg3wZlHd - zrash
1
非常好。我已经在Ubuntu 20.04.4 LTS上测试过了。它对我来说很有效。非常感谢,它节省了我的时间。 - ArunDhwaj IIITH
显示剩余7条评论

34

为了将您的凭证存储在缓存中,避免每次执行git操作时都需要登录,请按照以下步骤操作:

  1. 导航到本地仓库文件夹。
  2. 在当前文件夹的终端中执行:git config --global --replace-all credential.helper cache
  3. 执行git pushgit pull
  4. 使用用户名和访问令牌(访问令牌就是密码)登录。该令牌可以在GitHub中设置,并具有对repo、workflow、write:packages和delete:packages的访问权限。
  5. 重复执行git push或任何git操作,从现在开始将不再要求输入登录凭据。

27

测试环境 Ubuntu 20.04,几乎是全新安装,使用的 Git 版本为 2.25.1,Unity 版本为 7.5。

身份验证基础知识

Github 需要一个身份验证密钥(带有特定权限)。每个身份验证密钥都有一定的权限(读取私人仓库、读写公共仓库等),并且“充当密码”,同时可以随时撤销用户的权限。

个人访问令牌

  1. 首先创建一个 PAT。即:设置 --> 开发者设置 --> 个人访问令牌 --> 生成新令牌 --> 备注 --> 设置权限(可能是 repo、repo_hook)--> 生成令牌
  2. git push 仓库并在提示时输入生成的令牌(非常长的密码)作为密码。

不同方式存储密码

    • 可以将其存储在文件中,然后使用 xclip 将其带回剪贴板,并在每次粘贴时使用它(太麻烦了)
    • 使用 Git 命令的帮助 git config credential.helper cache <time-limit-of-cache> 进行缓存。但在超时后,您仍然需要以某种方式将密码放回剪贴板。
    • 使用 Git 命令 git config credential.helper store(不要使用 --global)永久存储它。这是未加密的。您可以打开文件并读取它。(例如,如果有人可以访问您的笔记本电脑,则可以使用可启动的 USB 读取密码(假设您的整个系统没有加密))。
    • 或者按照 此处 的说明进行加密。这并不复杂,只需三个简单的步骤。
sudo apt-get install libsecret-1-0 libsecret-1-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret
    
git config credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

这允许以加密格式存储密码/个人访问令牌。如果您需要,git config文件可以在本地repo的.git/config文件中找到,如这里所示。

P.S. 有很多地方建议使用Gnome-keyring,但显然已经弃用了。

为多个帐户存储密码/PAT

这变得棘手,@VonC建议我们需要一个Git-Credential-Manager core(GCM核心)。基于我在这个答案中的发现,这个答案得到了改进。

  1. First install GCM core

    1. Download latest .deb package
    2. sudo dpkg -i <path-to-package>
    3. git-credential-manager-core configure
    4. git config --global credential.credentialStore secretservice as we use libsecret
  2. Get latest git

    In my case I had git 2.25 and got error error: unknown option 'show-scope'. It appears that GCM core is using higher git (atleast 2.26).

    So install the latest and greatest git as per here:

     sudo add-apt-repository ppa:git-core/ppa
     sudo apt-get update
     apt list git # shows the latest git currently 2.31
     sudo apt-get install git #or sudo apt-get upgrade
    
  3. Update git remote path with username built in

    GCM core needs this to identify the different accounts.:(

     git remote set-url origin https://user1@github.com/user1/myRepo1.git
     git remote set-url origin https://user2@github.com/user1/myRepo1.git
                                   ^^^^^
    

您的~/.gitconfig文件将包含以下内容:

[credential]
   helper = /usr/bin/git-credential-manager-core
   credentialStore = secretservice
[credential "https://dev.azure.com"]
   useHttpPath = true

1
我之前必须使用 git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret erase 命令,然后保存新的 token。我已经在使用 libsecret 了。 - rvimieiro
1
你的回答很有用,但是有点戏剧化。这就是我所做的所有操作:git remote set-url origin https://username:your-personal-access-token@github.com/username/repo.git - iKev61
1
@iKev61 那么,你把密码存储在配置文件中了吗? - 9pfs
1
@9pfssupportsUkraine 没有使用密码。 - iKev61

6
我喜欢将它们加密存储在代码库中,并使用.envrc (https://direnv.net/) 加载它们。
为此,我使用 ssh-vault 加密数据,使用 GitHub 已经公开的 ssh 密钥,例如:
echo MY_TOKEN="secret" | ssh-vault -u <github-user> create > my-encypted-vars.ssh

然后,.envrc 的内容大致如下:

echo "Enter ssh key password"
context=$(ssh-vault view $HOME/projects/my-encrypted.ssh | tail -n +2)
export ${context}

这将解密my-encrypted-vars.ssh文件中的数据,并在每次进入项目目录时将MY_TOKEN设置为我的环境变量。
通过这样做,令牌/变量被“安全地”存储,并始终准备好作为环境变量使用。

2
我更喜欢使用官方凭据存储,正如我在我的回答中所解释的那样,但你提出的专用保险库的建议很有趣。+1 - VonC
我建议将 my-encrypted-vars.ssh 放在 .git 中,以避免将其检入源代码。 - CervEd

6

尝试启用此功能以帮助在推送/拉取时实现持久性

git config credential.helper store

对于持续克隆repo / macOS用户 / 安装iTerm2 https://iterm2.com/

enter image description here

启用工具栏

enter image description here

需要时只需点击片段。 附:您在使用oh-my-zsh吗? https://github.com/ohmyzsh/ohmyzsh


4
您可以使用以下方式缓存您的凭据,以定义的时间为限:
git config --global credential.helper cache

默认缓存时间为900秒(15分钟),但可以通过以下方式进行更改:
git config --global credential.helper 'cache --timeout=3600'

请查看以下 Github 页面:

https://docs.github.com/en/github/using-git/caching-your-github-credentials-in-git

这不是一个永久的商店,据其他评论所说,凭证不应存储为明文,这是一种安全风险。我使用一个密码管理器(https://bitwarden.com/)来存储PAT(个人访问令牌),然后在第一次使用时将其复制进去,然后缓存。如果您在Github帐户上启用了2FA,则需要PAT。

4
使用 git insteadOf。基本上用你的访问令牌 + https:// 替换每个 https://github 调用。 git config --global url."https://<username>:<github-token>@github.com/".insteadOf "https://github.com/ 现在,每次调用 github 都会自动附加您的凭据。
我在这里找到了这个好答案。 有关git insteadOf的更多信息。

3
好的,当您不想每次应用程序请求令牌时都要输入它时,您必须在某个地方保存令牌。一个好的解决方案是使用环境变量,正如一条评论中已经建议的那样。但是您仍然需要在某个地方设置环境变量。在Windows(我正在使用),您可以使用系统设置中的对话框(我不知道其他操作系统是否有类似的东西)。我不这样做,我更喜欢在我的项目中使用脚本。在私人项目中,您可以将其提交到源代码控制中,但这是一种偏好问题。在我的一个个人项目中,我也调用GitHub API,并使用个人访问令牌。这是一个命令行应用程序,最终用户将在配置文件中保存令牌(这是可以接受的)。但是我也需要令牌进行开发,因为该项目具有调用GitHub API的集成测试。并且该项目在GitHub上是公开的,因此我无法将令牌保存在源代码控制中。我所做的是:1. 我有一个名为environment-variables.bat的批处理文件(记住,我在Windows上),它设置了包括访问令牌在内的所有必需的环境变量。2. 我在我的构建脚本批处理文件中调用它来运行我的测试。3. environment-variables.bat在源代码控制中被忽略。4. 但是,在源代码控制中,有一个名为environment-variables.bat.sample的文件,其中包含相同的内容,但是使用虚假的令牌/密码。因此,我只需将此文件重命名为environment-variables.bat,将虚假密码替换为真实密码,一切都可以正常工作。

虽然这并不是所有情况下的完美解决方案。

在我的项目中,我遇到了一个问题,即未来需要使用更多 tokens/passwords 来处理更多的 API。

因此,在我的 environment-variables.bat 中的 tokens 数量将会增加,这将使潜在的贡献者很难实际执行所有集成测试。而且,我仍然不知道该如何处理这个问题


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