从GitHub将个人访问令牌存储在哪里?

从GitHub将个人访问令牌存储在哪里?,git,github,access-token,Git,Github,Access Token,在GitHub中生成个人访问令牌后,是否需要将其存储在机器上的某个本地位置 如果是,是否有任何首选的存储方式?好吧,如果您不想每次应用程序请求时都键入令牌,您必须将其保存在某个位置:-) 一个好的解决方案是使用环境变量,如中所述 但是您仍然需要在某个地方设置环境变量。 在Windows上(我正在使用),您可以在系统设置中使用(我不知道其他操作系统是否有类似的设置) 我不这样做,我更喜欢在我的项目中使用脚本。 在私有项目中,您可以将其提交给源代码管理,但这是一个偏好问题 在我的一个个人项目中,我也

在GitHub中生成个人访问令牌后,是否需要将其存储在机器上的某个本地位置


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

好吧,如果您不想每次应用程序请求时都键入令牌,您必须将其保存在某个位置:-)

一个好的解决方案是使用环境变量,如中所述

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

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

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

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

该项目在GitHub上是公共的,所以我无法在源代码管理中保存令牌

我所做的是:

  • 我有一个名为
    environment variables.bat的批处理文件(记住,我在Windows上),它设置了所有必需的环境变量,包括访问令牌
  • 我在我的和我用来运行测试的
  • 环境变量。bat
  • 但是在源代码管理中,有一个相反的,它包含相同的,但是一个伪造的令牌/密码
因此,我可以将这个文件重命名为
环境变量.bat
,用真实密码替换假密码,一切正常


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

在我的项目中,我遇到了一个问题,我需要在将来为更多的API使用更多的令牌/密码


因此,my
environment variables.bat
中的令牌数量将增加,这使得潜在贡献者很难实际执行所有集成测试。我仍然是。

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

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

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的个人访问令牌系统似乎基本上强迫您以纯文本形式存储令牌

首先,a不是一个简单的密码,而是一个等价物:

  • 您可以多次生成(例如,每台需要访问GitHub存储库的机器一次)
  • 您可以随时(从GitHub web界面)撤销该PAT,这使得该PAT过时,即使它在其中一台机器上徘徊
这与您的密码不同,您的帐户只有一个密码,如果不在您碰巧使用它的任何地方进行修改,就无法轻松更改密码


由于在命令行或API上使用Git通过HTTPS执行Git操作时,可以使用PAT代替密码,因此您可以使用安全缓存它。
例如,在Windows上,将通过以下方式使用:

当您第一次推动回购时,弹出窗口将询问您的凭证:用户名和PAT。
下一次,它将不会询问,并直接重用PAT,它将安全地存储在您的凭证管理器中

类似的想法也适用于Linux和Linux(在2021年,它将,)。
想法仍然是:将PAT存储在加密的凭证存储中


更现代的解决方案(2020年第4季度)是

您需要安装git credential manager core,下载它的

sudo dpkg-i
git凭据管理器核心配置
Linux支持尚未完全实现,但很快就会实现

尽管如此,在Linux上使用GCM(Git Credential Manager Core),如中所述,您需要首先定义一个
Git-config--global-Credential.credentialStore

见“”:

有四个选项用于存储Git Credential Manager Core(GCM Core)在Linux平台上管理的凭据:

  • GPG/兼容文件
  • Git内置的
  • 纯文本文件
默认情况下,未配置GCM核心。
您可以通过设置
GCM\u credential\u store
环境变量或
credential.credentialStore
Git配置设置来选择要使用的凭据存储

如中所述,在安装
libsecret-1-0
libsecret-1-dev
后使用
git-credential-libsecret
是很好的第一步。

但这最终应该由
凭证管理器核心

包装,我喜欢在存储库中对它们进行加密,并使用
.envrc
()

为此,我使用my加密数据,例如:

echo MY_TOKEN="secret" | ssh-vault -u <github-user> create > my-encypted-vars.ssh
这将解密
my encrypted vars.ssh
文件中的数据,并在每次我
cd
进入项目目录时将
my_TOKEN
设置到我的环境变量中


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

git:“凭据管理器”不是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页面:

这不是一个永久存储,根据其他注释,凭据不应以纯文本形式存储,这存在安全风险。我使用密码管理器()来存储密码
echo "Enter ssh key password"
context=$(ssh-vault view $HOME/projects/my-encrypted.ssh | tail -n +2)
export ${context}
git config --global credential.helper store
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
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
 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
 git remote set-url origin https://user1@github.com/user1/myRepo1.git
 git remote set-url origin https://user2@github.com/user1/myRepo1.git
                               ^^^^^
[credential]
   helper = /usr/bin/git-credential-manager-core
   credentialStore = secretservice
[credential "https://dev.azure.com"]
   useHttpPath = true