【问题标题】:Where to store my Git personal access token?在哪里存储我的 Git 个人访问令牌?
【发布时间】:2018-03-20 15:03:27
【问题描述】:

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

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

【问题讨论】:

  • 将您的令牌视为密码并对其保密。使用 API 时,使用令牌作为环境变量,而不是将它们硬编码到您的程序中。请参阅官方文档中的第 8 条:help.github.com/articles/…
  • 没错,我在生成访问令牌时看到了该评论,但我不确定人们在实践中如何保证它们的安全。
  • 这对我来说似乎很奇怪。密码的一半是(理想情况下)您记住它们并且系统对它们进行哈希处理,因此它们永远不会以纯文本形式存储在任何地方。然而 GitHub 的个人访问令牌系统似乎基本上强制你以纯文本形式存储令牌?
  • 它们是自动生成的,而且很长,所以记住它们不是一种选择。
  • 似乎 GitHub 刚刚禁用了 git push 的密码身份验证,现在强制使用令牌。所以现在我们必须以纯文本形式存储令牌或使用凭证助手为您存储它。无论如何,访问您计算机的人现在对您的存储库具有写入权限。 - 当我只能使用每次都必须输入的密码时,这种特殊的安全风险并不存在。我们不要忘记知道我密码的人可以轻松地使用它来创建自己的令牌。所以在安全性方面我们什么也得不到,除非 GitHub 也决定强制执行 2FA。

标签: git access-token


【解决方案1】:

密码的一半意义在于(理想情况下)您会记住它们并且系统会对它们进行哈希处理,因此它们永远不会以纯文本形式存储在任何地方。
然而 GitHub 的个人访问令牌系统似乎基本上强制您以纯文本形式存储令牌?

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

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

这与您的密码不同,密码是您的帐户所独有的,并且在您碰巧使用它的任何地方都必须修改密码才能轻松更改。


由于在命令行或 API 上使用 Git 通过 HTTPS 执行 Git 操作时可以使用 PAT 代替密码,因此您可以使用 git credential helper 安全地缓存它。
例如,在 Windows 上,这将使用the Windows Credential Manager,通过GCM-Core -- Git Credential Manager Core -- for Windows, Mac or Linux

git config --global credential.helper manager-core

第一次推送到仓库时,弹出窗口会询问您的凭据:用户名您的 PAT。
下一次,它不会询问,而是直接重用该 PAT,该 PAT 仍安全地存储在您的凭据管理器中。

类似的想法适用于 Mac with the OSX keychain 和带有 GNOME Keyring 的 Linux(2021 年将是 need a DBus session and libsecret),但在 2021 年,GCM-Core 涵盖了这些用例。
想法仍然存在:将 PAT 存储在 加密 凭据存储中。


如上所述,更现代的解决方案(2020 年第四季度)是Microsoft Git-Credential-Manager-Core

git config --global credential.helper manager-core

你需要安装git-credential-manager-core,下载它的latest release,比如gcmcore-linux_amd64.2.0.474.41365.deb

sudo dpkg -i <path-to-package>
git-credential-manager-core configure

现在(2021 年)未实施 Linux 支持。
尽管在 Linux 上使用 GCM(Git-Credential-Manager-Core),正如 Mekky Mayatathe comments 中所指出的那样,您需要先定义一个 git config --global credential.credentialStore

见“Credential stores on Linux”:

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

默认情况下,GCM Core 配置。
您可以通过设置GCM_CREDENTIAL_STORE 环境变量或credential.credentialStore Git 配置设置来选择要使用的凭据存储。

正如agent18the comments 中所指出的,在安装libsecret-1-0libsecret-1-dev 之后使用git-credential-libsecret 是一个很好的第一步。
但是,同样,它现在应该被 credential-manager-core 包裹起来。

【讨论】:

  • 您链接的 GNOME 密钥环解决方案不适用于 Ubuntu 20.04,如 the libgnome-keyring-dev package is not available in that suite。这就是你所说的Linux支持还没有完全实现的意思吗?有哪些推荐的解决方法,我在哪里可以查看正在取得的进展?
  • @Mxt GCM-Core 现在支持 Linux (github.com/microsoft/Git-Credential-Manager-Core/blob/master/…),现在是官方的解决方法。
  • 最后两行在git push之后给我以下错误:/var/tmp/.net/user/git-credential-manager-core/unqypyc0.awl/git-credential-manager-core get: 1: /var/tmp/.net/user/git-credential-manager-core/unqypyc0.awl/git-credential-manager-core: not found
  • 在 Linux 上运行上述命令后,它运行良好,但我得到“致命:未选择凭据后备存储”。通过编辑 git 配置文件 git config -e --global 并向其添加 credentialStore 值(纯文本、gpg、secretservice)解决了这个问题。谢谢@VonC​​pan>
  • @Mekky_Mayata 好点。我已经编辑了答案,以使该步骤对 Linux 更加可见,并添加了相关文档。
【解决方案2】:

在我的情况下,在 Ubuntu 中,接受的解决方案不适用于像

这样的消息

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

但是 store 而不是 manager 效果很好:

git config --global credential.helper store

【讨论】:

  • 只是为此添加一个注释 - 启用此功能后,您将在下一次提交时提示您输入您的信用。之后,它们被存储。
  • 这似乎将您的令牌以纯文本形式存储在 ~/.git-credentials
  • 我发现人们在发出警告后至少提供一个链接真的很有帮助。请查看here 以获取有关如何安全“存储” PAT 并使用 git 工作流程的出色说明。只需 3 行代码。
【解决方案3】:

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

身份验证基础知识

Github 需要一个身份验证密钥(具有与所述身份验证密钥相关的某些权限)。特定的身份验证密钥具有某些权限(读取私有存储库、读写公共存储库等...)并且“充当密码”以及可以在用户想要时撤销的权限。

个人访问令牌

  1. 我们首先创建一个PAT。 IE,设置-->开发者设置-->个人访问令牌-->生成新令牌-->注意-->设置权限(repo,repo_hook可能)-->生成令牌
  2. git push repo 并在询问时输入生成的令牌(非常长的密码)作为密码。

以不同方式存储密码

    • 可以在文件中完成,然后使用xclip 将其带回剪贴板并每次都粘贴(拧这个)
    • 使用help of git commands git config credential.helper cache &lt;time-limit-of-cache&gt; 缓存。但是您仍然必须在时间限制之后以某种方式将密码剪贴板。
    • 将其永久存储在文件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 repo 中的 .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 &lt;path-to-package&gt;
    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

【讨论】:

  • 我已经对你的回答投了赞成票,但是反馈很好。
  • 我之前必须使用git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret erase,然后保存新令牌。我已经在使用 libsecret
  • 你的回答很有用,但是太戏剧化了。这就是我所做的一切git remote set-url origin https://username:your-personal-access-token@github.com/username/repo.git
【解决方案4】:

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

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

【讨论】:

  • 请对您的回答进行详细解释,以便下一位用户更好地理解您的回答。
  • 这就像一个魅力,非常实用。 +1。对我来说,答案已经很清楚了。
  • 太棒了!!效果很好。您能否再补充一点解释背后的原因。
  • 这是一个该死的奥术魔法。它究竟是如何工作的?安全吗?
  • netrc 文件的详细信息及其与 inetutils 的链接在此链接中进行了说明。 gnu.org/software/inetutils/manual/html_node/…
【解决方案5】:

要将您的凭据存储在缓存中并避免每次执行 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 操作,您会发现它从现在开始不再要求提供登录凭据。

【讨论】:

    【解决方案6】:

    我喜欢将它们加密在存储库中并使用.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 文件中的数据,并在每次我将cd 放入项目目录时将MY_TOKEN 设置为我的环境变量。

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

    【讨论】:

    • 我更喜欢使用官方凭证存储,正如我所解释的 in my answer,但您关于专用保险库的提议很有趣。 +1
    • 我建议将my-encrypted-vars.ssh 放入.git 以避免将其签入源代码
    【解决方案7】:

    尝试启用此功能以帮助坚持推/拉

    git config credential.helper store
    

    对于 repo 的持续克隆/对于 macOS 用户/安装 iTerm2 https://iterm2.com/

    启用工具带

    只需在需要时单击 sn-p。 附言您正在使用 oh-my-zsh,不是吗? https://github.com/ohmyzsh/ohmyzsh

    【讨论】:

      【解决方案8】:

      好吧,您必须将令牌保存在某处,当您不想在每次应用请求时都输入它时:-)

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

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

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

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

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

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

      我做的是这样的:

      • 我有一个名为environment-variables.bat 的批处理文件(记住,我使用的是Windows),它设置了所有必需的环境变量,包括访问令牌
      • 我在我的 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

      【讨论】:

        【解决方案9】:

        您可以使用以下方法在定义的时间内缓存您的凭据:

        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

        这不是永久存储,并且根据其他 cmets 凭据不应以纯文本形式存储,这是一个安全风险。我使用密码管理器 (https://bitwarden.com/) 来存储 PAT (Personal Access Token),然后将其复制到第一次使用中,然后将其缓存。如果您在 Github 帐户上启用 2FA,则需要 PAT。

        【讨论】:

          【解决方案10】:

          在我的用例中,我将 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

          【讨论】:

            【解决方案11】:

            您可以使用pass 存储github https token

            将 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
            

            【讨论】:

            • 其实这是一个很好的答案!比 .netrc 好得多。缺点是它是 linux/macos 唯一的解决方案。但无论如何,Windows 都有自己的信用商店。
            【解决方案12】:

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

            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
            

            【讨论】:

            • 投反对票;虽然 ssh 密钥访问的一个很好的解决方案并没有解决 OP 关于个人访问令牌(又名 https 用户名:PAT 对)的问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-06
            • 1970-01-01
            • 2018-11-10
            • 2020-06-17
            • 2017-01-21
            • 2021-03-12
            • 1970-01-01
            相关资源
            最近更新 更多