在哪里存储我的Git个人访问令牌?

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

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

295469 次浏览

好吧,你必须保存令牌的某个地方,当你不想每次你的应用程序要求输入它时:-)

一个好的解决方案是使用环境变量,正如一个评论中已经建议的那样。

但是你仍然需要在某个地方设置环境变量 在Windows(我正在使用)上,您可以在系统设置(我不知道其他操作系统是否有类似的功能)中使用对话框 .

我不这样做,我更喜欢在我的项目中使用脚本 在私有项目中,你五月将此提交给源代码控制,但这是一个偏好问题 在我的一个个人项目中,我也使用个人访问令牌调用GitHub API 这是一个命令行应用程序,最终用户将令牌保存在配置文件(这没什么).

但我也需要开发令牌,因为项目有集成测试,我正在调用GitHub API。

这个项目在GitHub上是公开的,所以我无法在源代码控制中保存令牌。

我所做的是:

所以我可以将这个文件重命名为environment-variables.bat,用真实的密码替换假密码,一切都可以正常工作。


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

在我的项目中,我有一个问题,我需要在未来为更多的api使用更多的令牌/密码。

因此,我的environment-variables.bat 中的令牌数量增加了,这使得潜在的贡献者很难实际执行所有的集成测试。我仍然我不知道该怎么处理

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

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

首先,个人存取令牌不是一个简单的密码,而是等价的:

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

这与你的密码不同,密码是你的帐户唯一的,并且不能轻易更改,而不必在你碰巧使用它的任何地方修改它。


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

git config --global credential.helper manager-core
当你第一次推到一个回购,一个弹出窗口将要求你的凭据:用户名而且你的PAT。
下一次,它将不会询问,并直接重用该PAT,它仍然安全地存储在您的凭据管理器中 类似的想法适用于Mac与OSX钥匙链和带有GNOME密匙环的Linux(在2021年,它将是需要一个DBus会话和libsecret),但在2021年,GCM-Core涵盖了这些用例。
这个想法仍然是:将PAT存储在加密凭据存储中

如上所述,更现代的解决方案(Q4 2020)是微软Git-Credential-Manager-Core

git config --global credential.helper manager-core

你需要安装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上的凭据存储 . txt":

在Linux平台上,Git凭据管理器(GCM)有四个存储凭据的选项:

默认情况下,GCM来自配置。
您可以通过设置GCM_CREDENTIAL_STORE环境变量或credential.credentialStore Git配置设置来选择要使用的凭据存储
正如的评论中的agent18所指出的,在安装libsecret-1-0libsecret-1-dev后使用git-credential-libsecret是很好的第一步。
但是,同样,它现在应该被credential-manager-core包装

我喜欢在存储库中对它们进行加密,并使用.envrc (https://direnv.net/)加载它们

为此,我使用ssh-vault来加密使用ssh密钥,GitHub已经公开的数据,例如:

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文件中的数据,并在每次将cd放入项目目录时将MY_TOKEN设置为我的环境变量。

通过这样做,令牌/变量被“安全地”存储,并且随时可以作为环境变量使用

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

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

但是store代替manager工作得很好:

git config --global credential.helper store

您可以缓存您的凭证为一个定义的时间使用:

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/)来存储个人存取令牌,然后将其复制到第一次使用中,然后将其缓存到那里。如果您在Github帐户上启用2FA,则需要PAT。

测试 Ubuntu 20.04,几乎是新安装,Git 2.25.1和unity 7.5。

身份验证基础

Github需要一个认证密钥(与该认证密钥绑定的某些权利)。一个特定的认证密钥具有一定的权限(读取私有回购、读取和写入公共回购等),并且“充当密码”。再加上用户可以随时撤销的权限。

个人访问令牌

  1. 我们从创建帕特开始。即设置——>开发人员设置——比;个人访问令牌——>生成新的令牌>注意,在设置权限(repo,repo_hook maybe)——>生成令牌
  2. git push回购和输入生成的令牌(非常长的密码)作为密码时,询问。

以不同的方式存储密码

    • 可以在一个文件中完成,然后使用xclip将它带回剪贴板并每次粘贴它(该死的)
    • 使用git命令帮助 git config credential.helper cache <time-limit-of-cache>缓存。但在时间限制之后,你仍然需要用剪贴板记录密码。
    • 将其永久存储在使用git命令 git config credential.helper store文件中(不要使用——global)。这是不加密的。您可以打开文件并读取它。(例如,如果有人访问了你的笔记本电脑,他们可以使用一个可引导的USB读取密码(假设你的整个系统没有加密))。
    • 或者按照在这里进行加密。一点也不复杂。3个简单的步骤。
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文件可以在loca repo中的.git/config文件中找到,如在这里所示,如果你需要它的话。

< p >注: 有许多地方建议使用Gnome-keyring,但显然是弃用.

存储多个帐户的密码/ pat

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

  1. < p >第一安装GCM磁芯

    1. 下载最新的.deb包
    2. sudo dpkg -i <path-to-package>
    3. git-credential-manager-core configure
    4. git config --global credential.credentialStore secretservice,因为我们使用libsecret
  2. 获取最新git

    在我的情况下,我有2.25的git和得到错误error: unknown option 'show-scope'。看来GCM核心使用了更高的git (至少2.26)。< / p >

    因此,根据在这里安装最新和最好的git:

     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. 更新内置用户名的git远程路径

    GCM核心需要这个来识别不同的账户:(

     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

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

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

可以使用通过存储Github HTTPS令牌

将git主机映射到pass条目的两个备选方案:

  • bash脚本映射到右边的pass条目:
#!/usr/bin/env bash
# assuming "get" action from git and a config like this
# git config --global credential.helper $XDG_BIN_HOME'/git_credentials_from_pass $@'
while IFS= read -r line
do
echo "$line"
if [[ "$line" =~ host=.*github.com.* ]]; then
echo "username=your_user_name"
echo "password=$(pass show token_github.com/your_username)"
#else ...
fi
done

改变your_usernametoken_github.com,就像你用pass insert设置它一样。

这将令牌添加到pass,而不需要输入或粘贴两次:

echo your_github_token | sed p | pass add token_github.com/your_username
git config --global credential.helper '!pass-git-helper $@'
pass-git-helper需要一个ini文件来映射git请求和pass条目。 ${XDG_CONFIG_HOME}/pass-git-helper/git-pass-mapping.ini例子:< / p >
[DEFAULT]
username_extractor=entry_name
[github.com*]
target=token_${host}/your_github_username

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

git config credential.helper store

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

enter image description here

使直到

enter image description here

只要在你需要的时候点击片段。 另外,你在用哦,我的zsh,对吧? https://github.com/ohmyzsh/ohmyzsh < / p >

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

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

在我的用例中,我将PAT存储在密码管理器中,例如LastPass, KeePass, 1Password。当我在Linux环境(例如Docker)中需要它时,我将PAT保存在一个环境变量中,然后使用git的凭据帮助器设置。例如:

git config --global credential.helper 'cache --timeout 600'


<< eof tr -d ' ' | git credential-cache store
protocol=https
host=github.com
username=nonce
password=${GITHUB_PAT}
eof

对于PAT,用户名可以是任何东西,除了空白。以下是详细阐述的要点:

https://gist.github.com/rwcitek/da862e9e27cc28d3e96e62a2ca4b2b64

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

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

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

·curl - ssl https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg

·echo "deb [arch=$(dpkg——print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.]https://cli.github.com/packages稳定的主quot;| sudo tee /etc/apt/sources.list.d/github-cli. txt在列表/ dev / null

·sudo apt更新

·sudo apt安装gh

·gh认证登录(它会要求输入协议和令牌)

·然后再次克隆回购。它不是要信物

使用git 传播速度。基本上用你的访问令牌+ https://替换每一个htpps://github调用

git config --global url."https://<username>:<github-token>@github.com/".insteadOf "https://github.com/

现在每次调用github都会自动添加您的凭据。

我在在这里中找到了这个伟大的答案。 关于git传播速度的更多信息