从GitHub存储个人访问令牌的位置?

时间:2017-10-09 11:54:32

标签: git github access-token

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

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

9 个答案:

答案 0 :(得分:15)

  

半点密码是(理想情况下)您记住密码并且系统会对其进行哈希处理,因此它们永远不会以纯文本形式存储在任何地方。
  但是GitHub的个人访问令牌系统似乎从根本上迫使您将令牌存储为纯文本格式?

首先,PAT (Personal Access Token)不是简单的密码,而是等效的密码:

  • 您可以生成多个时间(例如,每台计算机需要一个时间来访问GitHub存储库)
  • 您可以随时(从GitHub Web界面)吊销,这使得该PAT已过时,即使它在其中一台机器上徘徊。

与您的帐户独有的密码不同,您无需在所有碰巧使用它的地方都进行 修改就可以轻松地对其进行更改。


由于在命令行或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 需要一个身份验证密钥(具有与所述身份验证密钥相关联的某些权利)。特定的身份验证密钥具有某些权限(读取私有存储库、读写公共存储库等...)并且“充当密码”以及可以在用户需要时随时撤销的权限。

个人访问令牌

  1. 我们从制作 PAT 开始。即,设置 --> 开发人员设置--> Persaonl 访问令牌 --> 生成新令牌 --> 注意 --> 设置权限(可能是 repo,repo_hook) --> 生成令牌
  2. git push 存储库并在询问时键入生成的令牌(很长的密码)作为密码。

以不同方式存储密码

    • 可以在一个文件中完成,然后使用 xclip 将其带回剪贴板并每次都粘贴(拧这个)
    • 使用 help of git commands git config credential.helper cache <time-limit-of-cache> 缓存。但是您仍然必须在时间限制后以某种方式将密码剪贴板。
    • 将其永久存储在文件 with git commands git config credential.helper store 中(不要使用 --global)。这不是加密的。您可以打开文件并阅读它。 (例如,如果有人访问您的笔记本电脑,他们几乎可以使用可启动 USB 读取密码(假设您的整个系统未加密))。
    • 或者按照 here 走加密路线。它一点也不复杂。 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 存储库的 .git/config 文件中找到,如here 所示,如果您需要的话。

附言 有很多地方建议使用 Gnome-keyring,但显然是 deprecated

为多个帐户存储密码/PAT

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

  1. 第一个install GCM core

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

答案 3 :(得分:2)

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

一个好的解决方案是使用环境变量,如one comment中已经提到的那样。

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

我不这样做,我更喜欢我项目中的脚本 在私有项目中,可能将此提交给源代码控制,但这是首选。

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

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

该项目在GitHub上是公开的,因此我无法将令牌保存在源代码管理中。

我做的是:

  • 我有一个批处理文件(请记住,我在Windows上)名为environment-variables.bat,它设置了所有必需的环境变量,包括访问令牌
  • 我在我的build scriptbatch file我用来运行我的测试中调用此内容
  • environment-variables.batignored 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)

我想在存储库中对它们进行加密,并使用.envrchttps://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 条目的两种替代方法:

  • 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 示例:

[DEFAULT]
username_extractor=entry_name
[github.com*]
target=token_${host}/your_github_username