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

如果是,是否有首选的存储方式?


当前回答

安装Git凭证管理器!https://github.com/GitCredentialManager/git-credential-manager。GCM支持缓存以及在会话之间持久存在的各种特定于平台的凭据存储。

更棒的是:GCM支持用户友好的安全认证GitHub和GitLab通过web浏览器与OAuth。这意味着您甚至不再需要创建个人访问令牌。当你推送git时,只需按照链接到GitHub并授权应用程序。后续的身份验证不需要交互。

OAuth比个人访问令牌更安全,因为令牌的有效期很短,在需要时使用更长的刷新令牌进行刷新。

其他回答

密码的一半意义在于(理想情况下)你记住它们,系统对它们进行哈希,因此它们永远不会以纯文本的形式存储在任何地方。 然而,GitHub的个人访问令牌系统似乎基本上迫使你以纯文本存储令牌?

首先,PAT(个人访问令牌)不是一个简单的密码,而是一个等价的密码:

你可以生成多个时间(例如,每台机器一个你需要访问GitHub存储库) 你可以在任何时候撤销(从GitHub web界面),这使得PAT过时,即使它徘徊在其中一台机器上。

这与你的密码不同,密码是你账户的唯一密码,如果你在任何地方使用它,都必须修改它,否则无法轻易更改。


由于在命令行或API上使用Git通过HTTPS执行Git操作时,可以使用PAT代替密码,因此可以使用Git凭据帮助器安全地缓存它。 例如,在Windows上,将使用Windows凭据管理器,通过GCM—Git凭据管理器—用于Windows, Mac或Linux:

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

(在2022年第四季度Git 2.39+中,manager-core被替换/重命名为manager)

第一次你推到一个回购,一个弹出窗口将要求你的凭证:用户名和你的PAT。 下一次,它将不会询问,并直接重用该PAT,该PAT仍然安全地存储在凭据管理器中。

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


如上所述,更现代的解决方案(2020年第四季度)是Microsoft git -凭据管理器- core,或2022年第四季度,Microsoft git -凭据管理器

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

在Git 2.39 (Q4 2022)之前,适用于Linux:

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

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

不过,正如Mekky Mayata在评论中指出的那样,在Linux上使用GCM (git - credential - manager - core)时,您需要定义一个git config -global credential。credentialStore第一。

参见“Linux上的凭据存储”:

在Linux平台上,Git凭据管理器(GCM)有四个存储凭据的选项: freedesktop.org特勤局API GPG/pass兼容文件 Git内置的凭据缓存 纯文本文件 默认情况下,未配置GCM。 您可以通过设置GCM_CREDENTIAL_STORE环境变量或凭据来选择要使用的凭据存储。credentialStore Git配置设置。

正如agent18在评论中指出的那样,在安装libsecret-1-0和libsecret-1-dev之后使用git-credential-libsecret是很好的第一步。 但是,同样,现在应该由凭证管理器核心包装(在Git 2.39之前)。

基本上我是在我的机器上做的:

https://gist.github.com/bsara/5c4d90db3016814a3d2fe38d314f9c23

我的配置文件脚本与描述略有不同:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
        . "$env" >| /dev/null ; 
}

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

为了在缓存中存储您的凭据并避免每次执行git操作时都登录,请遵循以下步骤:

导航到本地存储库文件夹。 在当前文件夹的终端:git config——global——replace-all credential。辅助缓存 执行git push或git pull。 使用用户名和访问令牌登录(访问令牌是您的密码)。令牌可以在GitHub中设置,并可以访问repo,工作流,write:packages和delete:packages。 重复git push或任何git操作,你会发现从现在开始它不再要求登录凭据。

尝试启用此功能以帮助跨推/拉持久化

git config credential.helper store

对于正在克隆的repo / macOS用户/安装iTerm2 https://iterm2.com/

使直到

只要在需要时单击该片段即可。 另外,你在用哦,我的zsh,对吧? https://github.com/ohmyzsh/ohmyzsh

以我为例,在Ubuntu中,被接受的解决方案不能处理像这样的消息

Git: 'credential-manager'不是Git命令

但是店长却做得很好:

git config --global credential.helper store