使用令牌在GitHub上进行身份验证

572

我正在尝试使用个人访问令牌来认证GitHub。在GitHub的帮助文件中,它指出要使用cURL方法进行身份验证 (创建个人访问令牌)。我已经尝试过这样做了,但仍无法将其推送到GitHub。请注意,我正在从未经身份验证的服务器 (Travis CI) 推送。

cd $HOME
git config --global user.email "emailaddress@yahoo.com"
git config --global user.name "username"

curl -u "username:<MYTOKEN>" https://github.com/username/ol3-1.git
git clone --branch=gh-pages https://github.com/username/ol3-1.git gh-pages

cd gh-pages
mkdir buildtest
cd buildtest
touch asdf.asdf

git add -f .
git commit -m "Travis build $TRAVIS_BUILD_NUMBER pushed to gh-pages"
git push -fq origin gh-pages

这段代码导致了错误:

远程: 拒绝对scuzzlebuzzle/ol3-1.git的匿名访问。

致命错误: 认证失败,无法访问'https://github.com/scuzzlebuzzle/ol3-1.git/'


3
截至2021年8月28日,GitHub CLI可以用于身份验证(无需生成PAT,如果可以打开浏览器,可以直接使用密码登录)。请参阅:https://github.com/cli/cli#installation,https://cli.github.com/manual/gh_auth_login - Nagabhushan S N
31个回答

547

你的curl命令完全错误。你应该使用以下命令:

curl -H 'Authorization: token <MYTOKEN>' ...

除此之外,即使这个仓库是私有的,也不能授权你的计算机克隆该仓库。(不过看一眼就知道它不是私有的。)你通常会按照以下步骤进行:

git clone https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git --branch=gh-pages gh-pages

这将把您的凭据添加到克隆存储库时创建的远程。然而,不幸的是,您无法控制Travis如何克隆您的存储库,所以您必须像这样编辑远程。

# After cloning
cd gh-pages
git remote set-url origin https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git

这将修复你的项目,以使用内置凭据的远程仓库。

警告: 访问令牌具有读写权限,应该像密码一样处理。如果在克隆或添加远程仓库时将访问令牌输入到克隆 URL 中,Git 将其以明文形式写入 .git/config 文件中,这是一个安全风险。


1
我不知道你所说的编辑器按钮是什么,但删除原始遥控器绝对是必要的。 - Ian Stapleton Cordasco
1
嘿。酷。很高兴能帮忙。 - Ian Stapleton Cordasco
19
无需删除远程仓库,您可以使用set-url命令来替换它,例如:git remote set-url origin https://scuzzlebuzzle:<MYTOKEN>@github.com/scuzzlebuzzle/ol3-1.git - berkus
3
不安全的方法。密钥容易因错误而被记录在日志中。改为使用严格范围的部署密钥。 - Joseph Lust
5
你要找的命令是 git remote set-url origin https://<USERNAME>:<MYTOKEN>@github.com/<USERNAME>/<REPO>.git - Lukas
显示剩余15条评论

359

首先,您需要创建一个个人访问令牌(PAT)。具体信息在此处描述:https://help.github.com/articles/creating-an-access-token-for-command-line-use/

可笑的是,这篇文章告诉你如何创建它,却没有提供任何关于如何使用它的线索。经过大约一小时的文档和Stack Overflow搜索,我终于找到了答案:

$ git clone https://github.com/user-or-organisation/myrepo.git
Username: <my-username>
Password: <my-personal-access-token>

当我远程工作并且还有本地更改时,公司政策强制要求我启用双重认证,因此实际上我需要的不是clone,而是push。我在很多地方都读到需要删除和重新创建远程仓库,但事实上我的普通push命令与上面的clone命令完全相同,远程仓库没有改变:

$ git push https://github.com/user-or-organisation/myrepo.git
Username: <my-username>
Password: <my-personal-access-token>

(@YMHuang给了我文档链接,让我找到正确的方向。)


61
那我们应该从哪里获取令牌以便在需要时输入它?我们真的需要复制到每个文件中并粘贴到认证提示中吗?如果是这样的话,那就是我听说过的最糟糕的工作流程了,但Git文档似乎没有其他建议。 - Neutrino
7
从2021年8月13日开始,在GitHub.com上进行Git操作时,我们将不再接受账户密码作为身份验证方式。这应该很有意思。 - luizfls
53
为什么他们在创建代币后不解释如何处理代币?! - Rony Tesler
32
今天末日来临了 :( - pellucidcoder
7
没有人能够脱口而出地知道他们的PAT。所以他们“强制”我们将PAT放入git配置文件中,以便远程URL中的任何人都可以访问它。我不理解GitHub做出这个决定的原因。 - T3rm1
显示剩余8条评论

179

生成令牌

根据创建个人访问令牌的说明生成令牌。 (GitHub 资料 -> 设置 -> 开发人员设置 -> 个人访问令牌)

实际使用令牌

  • 如果您已经在本地克隆了存储库
git remote remove origin
git remote add origin https://[TOKEN]@github.com/[REPO-OWNER]/[REPO-NAME]
git push
  • 如果您正在克隆新存储库
git clone https://[TOKEN]@github.com/[REPO-OWNER]/[REPO-NAME]

(用您的信息替换方括号及其之间的内容。@后面的部分与存储库网址相同,不包含 https://)


1
为确保在推送到Github时所有这些步骤都能正常工作,您需要选择要授予此令牌访问您的存储库的范围或权限。 - Noha Salah
7
如果你像我这样蠢笨地为一个组织尝试这个操作,请注意[USER]指的是你的组织用户名,而不是你的个人用户名。 - Gedde
6
实际上,您不需要删除原始内容再添加。它会被覆盖,所以只需“添加”即可。 - testing_22
2
很好地更新了现有本地仓库上的过期令牌。谢谢。 - Milo Persic
1
好的,所以在我的帐户之前,使用ssh受到私钥保护,现在它没有保护了。这让我很困扰... - kritzikratzi
显示剩余3条评论

130

我使用ssh,这对我有用:

设置开发者设置生成新的令牌

git remote set-url origin https://[APPLICATION]:[NEW TOKEN]@github.com/[ORGANISATION]/[REPO].git

43
同样适用于个人访问令牌,格式如下:git remote add origin https://[USERNAME]:[NEW TOKEN]@github.com/[USERNAME]/[REPO].git - CommandZ
6
我需要执行git remote add origin https://[USERNAME]:[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git命令。 - pacoverflow
2
对我也起作用的命令是 git remote add origin https://[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git。 - Thomas Chafiol
5
您可以使用类似于git remote set-url origin https://[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git> /dev/null 2>&1的命令来避免记录不安全的git输出。将token存储在变量中以避免在日志中显示。但是,它需要被存储在某个地方。为了进一步保护,您可以将其加密存储。例如,Travis CI支持此方法。 - kap
2
@ThomasChafiol和TheRealChx101,当您的令牌过期或者例如Windows密码更新了公司范围内的企业身份验证时,这将是正确的方法,或者更好的方法是结合你们两个的答案:git remote set-url origin https://[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git - ccreedon1
显示剩余3条评论

89

10
关键是设置git,使您无需始终提示输入令牌,具体方法可参考此处 - https://help.github.com/articles/caching-your-github-password-in-git/其他回答此问题的方法会将您的令牌明文写入.git/config文件中,可能存在安全风险。 - jerome
这是目前最安全的方法。 - Ismail

89

Step 1: 获取访问令牌

前往以下链接:https://github.com/settings/tokens,并在此生成令牌。

或者从您的Github账户进入:
设置 -> 开发人员设置 -> 个人访问令牌

Step 2: 使用令牌

git push

Username: <your username>
Password: <the access token>
->

15
如果有人希望让事情像Omar那样工作,除非我首先执行$ git config credential.helper store,否则我无法使它正常工作。注意:凭据将以未加密的形式保存在您的主目录中的文件中,请谨慎使用。 更好的解释可以在这里找到 - Steinarr
3
@Steinarr,链接无效。 - Timo
1
@Timo 这里是 Wayback Machine 的链接,可以查看该网站的历史版本:https://web.archive.org/web/20201216132223/http://gmacario.github.io/2017/08/08/cmdline-git-with-github-2fa.html - Steinarr
3
比这更简单是不可能的。谢谢! - Emerson Pardo
1
这个效果非常好! - zero_cool

42

为了避免交出“城堡的钥匙”...

请注意,sigmavirus24的回答要求您向Travis提供一个具有相当广泛权限的令牌——因为GitHub只提供像“编写所有我的公共存储库”或“编写所有我的私人存储库”这样的广域范围令牌。

如果您想 tightening down access(需要更多工作!),您可以结合使用 GitHub 部署密钥和 Travis 加密的 yaml 字段。

下面是该技术的概要...

首先生成一个名为my_key的 RSA 部署密钥(通过 ssh-keygen)并将其添加为部署密钥在您的 GitHub 存储库设置中。

然后...

$ password=`openssl rand -hex 32`
$ cat my_key | openssl aes-256-cbc -k "$password" -a  > my_key.enc
$ travis encrypt --add password=$password -r my-github-user/my-repo

然后使用$password文件在集成时解密您的部署秘钥,只需将其添加到您的yaml文件中:

before_script: 
  - openssl aes-256-cbc -k "$password" -d -a -in my_key.enc -out my_deploy_key
  - echo -e "Host github.com\n  IdentityFile /path/to/my_deploy_key" > ~/.ssh/config
  - echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" > ~/.ssh/known_hosts

注意:最后一行会预填Github的RSA密钥,这样就避免了在连接时手动接受的需要。


40

对于 macOS 用户,如果没有出现用户名和密码的提示请求,那么这意味着您的密码已经存储在钥匙串访问中。每次尝试克隆或推送时都会尝试使用旧密码。

按照以下三个步骤解决此问题:

  1. 生成 PAT(个人访问令牌)- 链接
  2. 打开 KeyChain Access(通过 Spotlight 搜索)→ 搜索 GitHub → 点击 GitHub → 使用新的 PAT 进行更改并保存 链接
  3. 再次尝试推送或克隆。现在您已经将 PAT 存储在钥匙串中,而不是密码。

救命稻草!谢谢! - Panos
说真的,我永远也想不到这个,非常感谢你! - Vayl
1
这应该在Github的常见问题解答中准确地写出来。如果已经有了,我找不到它。感谢您使这变得非常清晰明了。 - returnVoid
唯一有助于更新令牌而不是设置新令牌的答案。应该排名更高。 - Abhinav Mathur

39

通常我会这样做:

 git push https://$(git_token)@github.com/user_name/repo_name.git
< p > git_token Azure DevOps 的变量 config 中读取。

您可以在这里阅读我的完整博客文章。


这可能会调用: 远程: 无匿名写访问权限。 - Fergus
我实际上必须删除美元符号才能使它工作。因此,模板实际上应该是这样的:git push https://(git_token)@github.com/user_name/repo_name.git - Bialomazur

37

您可以轻松更改远程认证,首先:

删除当前源:

git remote remove origin

接着:

git remote add origin https://<TOKEN>@github.com/<USERNAME>/<REPO>.git

你可以在这里查找有关生成认证令牌的方法。


3
这是一个超级答案,以上的都没有起作用。 - Kolyo Peev
对我没有用! - jtlz2
2
确认这个有效! - MocXi
1
这是我现在的首选方法,GitHub做出了这个决定真是太奇怪了。 - Amia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接