在GitHub中生成个人访问令牌后,是否有必要将其存储在本地的某个位置?
如果是,是否有任何可以存储的首选方式?
答案 0 :(得分:15)
半点密码是(理想情况下)您记住密码并且系统会对其进行哈希处理,因此它们永远不会以纯文本形式存储在任何地方。
但是GitHub的个人访问令牌系统似乎从根本上迫使您将令牌存储为纯文本格式?
首先,PAT (Personal Access Token)不是简单的密码,而是等效的密码:
与您的帐户独有的密码不同,您无需在所有碰巧使用它的地方都进行 修改就可以轻松地对其进行更改。
由于在命令行或API上使用Git通过HTTPS执行Git操作时,可以用PAT代替密码,因此可以使用git credential helper安全地对其进行缓存。
例如,在Windows上,将通过the Windows Credential Manager使用GCM -- Git Credential Manager -- for Windows:
git config --global credential.helper manager
第一次进入存储库时,会弹出一个窗口要求您提供凭据:用户名和您的PAT。
下次,它不会询问并直接重用该PAT,该PAT仍安全地存储在您的凭据管理器中。
类似的想法适用于Mac with the OSX keychain,而Linux则适用于GNOME Keyring。
这个想法仍然存在:将PAT存储在加密的凭据存储中。
答案 1 :(得分:6)
就我而言,在Ubuntu中,接受的解决方案不适用于类似这样的消息
git:'credential-manager'不是git命令
但是用store
代替manager
效果很好:
git config --global credential.helper store
答案 2 :(得分:5)
测试 Ubuntu 20.04,几乎全新安装,使用 Git 2.25.1 和 unity 7.5。
身份验证基础
Github 需要一个身份验证密钥(具有与所述身份验证密钥相关联的某些权利)。特定的身份验证密钥具有某些权限(读取私有存储库、读写公共存储库等...)并且“充当密码”以及可以在用户需要时随时撤销的权限。
个人访问令牌
git push
存储库并在询问时键入生成的令牌(很长的密码)作为密码。以不同方式存储密码
xclip
将其带回剪贴板并每次都粘贴(拧这个)git config credential.helper cache <time-limit-of-cache>
缓存。但是您仍然必须在时间限制后以某种方式将密码剪贴板。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
文件可以在您的 loca 存储库的 .git/config
文件中找到,如here 所示,如果您需要的话。
附言 有很多地方建议使用 Gnome-keyring,但显然是 deprecated。
为多个帐户存储密码/PAT
这变得很棘手,@VonC 建议我们需要一个 Git-Credential-Manager core
(GCM 核心)。根据我在 this answer 中的发现,此答案得到了增强。
sudo dpkg -i <path-to-package>
git-credential-manager-core configure
git config --global credential.credentialStore secretservice
,因为我们使用 libsecret
获取最新的 git
就我而言,我使用 git 2.25 并收到错误 error: unknown option 'show-scope'
。看来 GCM 核心正在使用更高的 git
(至少 2.26)。
因此,请按照 here 安装最新最好的 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
使用内置用户名更新 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
答案 3 :(得分:2)
好吧,你必须在某个地方保存令牌,当你不想在每次你的应用程序要求时输入它: - )
一个好的解决方案是使用环境变量,如one comment中已经提到的那样。
但你仍然需要在某处设置环境变量 在Windows(我正在使用)上,您可以在系统设置中使用dialog box (我不知道其他操作系统是否有类似的东西)。
我不这样做,我更喜欢我项目中的脚本 在私有项目中,可能将此提交给源代码控制,但这是首选。
在我的一个个人项目中,我也使用个人访问令牌调用GitHub API。
它是一个命令行应用程序,最终用户将令牌保存在配置文件中(可以)。
但我也需要开发令牌,因为该项目有集成测试,我正在调用GitHub API。
该项目在GitHub上是公开的,因此我无法将令牌保存在源代码管理中。
我做的是:
environment-variables.bat
,它设置了所有必需的环境变量,包括访问令牌environment-variables.bat
是ignored in source control environment-variables.bat.sample
代替,它包含相同的内容,但却是一个伪令牌/密码。所以我可以将此文件重命名为environment-variables.bat
,用真实密码替换假密码,一切正常。
但这并不是所有案例的完美解决方案。
在我的项目中,我遇到的问题是我需要在将来使用更多令牌/密码来获取更多API。
因此,environment-variables.bat
中的令牌数量会增加,这使得潜在的贡献者很难实际执行所有集成测试。我仍然don't know how to deal with that。
答案 4 :(得分:1)
基本上我是在我的机器上这样做的:
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
答案 5 :(得分:1)
我想在存储库中对它们进行加密,并使用.envrc
(https://direnv.net/)加载它们
为此,我使用ssh-vault使用ssh keys that GitHub already is exposing加密数据,例如:
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
设置为我的环境变量。
这样做,令牌/变量被“安全地”存储,并随时可以用作环境变量
答案 6 :(得分:1)
您可以使用以下方法在定义的时间内缓存您的凭据:
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 (Personal Access Token),然后将其复制到第一次使用中,然后将其缓存。如果您在 Github 帐户上启用 2FA,则需要 PAT。
答案 7 :(得分:1)
或者,您可以在主目录中创建一个 ~/.netrc
文件并将您的登录凭据保存到其中。
cat ~/.netrc
machine github.com login <login-id> password <token-password>
答案 8 :(得分:0)
您可以使用 github https token 存储 pass。
将 git 主机映射到 pass 条目的两种替代方法:
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_username
和 token_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
示例:
[DEFAULT]
username_extractor=entry_name
[github.com*]
target=token_${host}/your_github_username