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

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


当前回答

在Ubuntu 20.04上测试,几乎是全新安装,使用Git 2.25.1和unity 7.5。

身份验证基础

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

个人访问令牌

我们从PAT开始。即设置——>开发人员设置——> personaonl访问令牌——>生成新的令牌——>注意——>设置权限(repo,repo_hook可能)——>生成令牌 Git推送回购,并在请求时输入生成的令牌(很长的密码)作为密码。

以不同的方式存储密码

Can be done in a file and then using xclip to bring it back to clipboard and paste it everytime (Screw this) Cache with the help of git commands git config credential.helper cache <time-limit-of-cache>. But you still have to somehow clipboard the password after the timelimit. Store it permanently in a file with git commands git config credential.helper store (don't use --global). This is NOT ENCRYPTED. You can open the file and read it. (e.g., If someone gets access to your laptop they can pretty much read the Password using a bootable USB (assuming your whole system is not encrypted)). Or go the encryption route as per here. It is not complicated at all. 3 simple steps.

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配置文件可以在loca repo的.git/config文件中找到,如这里所示,如果您需要它的话。

注: 有许多地方建议使用Gnome-keyring,但显然不建议使用。

存储多个帐户的密码/ pat

这变得很棘手,@VonC建议我们需要一个git - credentials - manager核心(GCM核心)。这个答案是基于我在这个答案中的发现而加强的。

First install GCM core Download latest .deb package sudo dpkg -i <path-to-package> git-credential-manager-core configure git config --global credential.credentialStore secretservice as we use libsecret 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 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

其他回答

我喜欢在存储库中对它们进行加密,并使用.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文件,并设置MY_TOKEN到我的环境变量,每次我cd到项目目录。

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

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

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。

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

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代替。基本上,将每个https://github调用替换为访问令牌+ https://

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

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

我在这里找到了很好的答案。 更多关于git insteadOf的信息。

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

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

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

我不这么做,我更喜欢在我的项目中使用脚本。 在私有项目中,您可以将此提交给源代码控制,但这是一个偏好问题。

在我的一个个人项目中,我也使用个人访问令牌调用GitHub API。 这是一个命令行应用程序,最终用户将在配置文件中保存令牌(这是OK的)。

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

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

我所做的是:

我有一个批处理文件(记住,我在Windows上),名为environment-variables.bat,它设置所有必需的环境变量,包括访问令牌 我在构建脚本和用于运行测试的批处理文件中调用此函数 在源代码控制中会忽略Environment-variables.bat 但是在源代码控制中,有environment-variables.bat。相反,其中包含相同的,但假的令牌/密码。

因此,我只需将该文件重命名为environment-variables.bat,将假密码替换为真实密码,就可以正常工作了。


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

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

因此,我的environment-variables.bat中的令牌数量将会增加,这使得潜在的参与者很难实际执行所有集成测试。我到现在都不知道该怎么办。