启用2FA后,Git身份验证失败


97

我刚刚启用了2FA(我想不出所做的任何其他更改),并且git询问了我的用户名和密码。我提供了两个,但是它们是“错误的”。我在这里尝试了许多解决方案:Git push需要输入用户名和密码,但这不起作用。特别是,当从https切换到ssh时,ssh密钥会

权限被拒绝(公钥)。致命:无法从远程存储库读取。

$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

Username for 'https://github.com': **********
Password for 'https://mlbileschi@github.com': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/mlbileschi/scala.git/'

有小费吗?


1
“权限被拒绝(公共密钥)。致命:无法从远程存储库读取。” 是可以通过设置为您的帐户的SSH密钥来解决另外一个问题:help.github.com/articles/...
Ajedi32

1
通常这不是2FA问题,而是通过将https更改为git来解决
SCBuergel.eth

Answers:


125

您需要生成访问令牌。您可以通过转到设置页面来创建一个。

enter image description here

在命令行中将此访问令牌用作密码。


嗯,我尝试将set-url设置为https之后,但没有成功。我还尝试将set-url返回ssh,并删除了.ssh / known_hosts条目,但无济于事。
Max Bileschi 2014年

您可以将命令行输出添加到您的问题吗?包括您正在执行的命令。
Gergo Erdosi 2014年

加入输出
最大Bileschi

我遇到了一个奇怪的问题,必须开始克隆并输入新的访问令牌。此后(甚至无需等待克隆完成),我便可以将新的访问令牌提供给尝试运行的原始目录git pull。可能是本地问题,但这可能对某人有所帮助。
sg 2015年

The requested URL returned error: 403当我使用令牌作为密码来推送https时,我得到了
stelios 18'Aug

38

端到端解决方案需要3个步骤。

  1. 感谢Gergo Erdosi。他的回答基本上是正确的,只是Github更改了该设置页面。从2016年末开始,您需要从“ 个人访问令牌”页面生成访问令牌

    在此处输入图片说明

    在命令行中将此访问令牌用作密码。

  2. 您可以通过将用户名包含到项目远程URL中来保留用户名。一种方法是编辑.git/config,将url行修改为以下格式:

    url = https://YOUR_USERNAME_HERE@github.com/owner/repo.git

  3. 您只能通过一次运行以下命令来保留密码:

    $ git config credential.helper store

    然后您将来的git密码将以格式以纯文本格式存储在〜/ .git-credentials中https://user:PlaintextPassword@example.com

    以明文形式存储密码通常会被视为安全隐患。但是在这种2FA情况下,凭据不是您的真实密码,它是随机生成的字符串。因此,它与使用ssh私钥和无密码短语的ssh私钥一样安全。CAVEAT:请记住,如果您恰巧在该计算机上也使用了另一个没有2FA的git帐户,那么这些真实密码也将以纯文本格式存储。

PS:或者,您可以选择使用基于ssh的登录,并使用受密码保护的ssh私钥,这样做会更安全且更不方便,但这不在此答案的范围内。


1
这对我有用,使我不必每次与git交互时都输入un和pw。我将Windows与cygwin一起使用,却无法使ssh密钥正常工作-确实如此!
liltitus17年

关于最后一段:...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.根本不是真的。开箱即用的密码短语可以轻松保护SSH密钥。普通~./git-credentials-根本没有固定!
maxkoryukov

此外,该存储在纯文本文件中的API KEY允许:访问GitHub API(取决于范围,但很可能每个拥有apikey的人都可以访问repo的源代码)并执行任何 git操作(推,拉)。换句话说,这样的纯文本文件是一个了不起的礼物,尤其是如果您可以访问私有存储库(可能它们很快就会公开)
maxkoryukov

@maxkoryukov好的,我将最后一句话改写为“与使用无密码短语的ssh私钥一样安全”吗?因为第3步的全部要点是试图绕过提示输入密码的提示(当然,假设您在自己的计算机上工作)。在这种情况下,如果有人设法获得您的〜/ .git-credentials或您的无密码的ssh私钥,那么结果将是相同的。我确实同意您的观点,即受密码保护的ssh密钥会更安全(且不太方便)。
RayLuo

@RayLuo,LGFM;)
maxkoryukov

16

我有一个类似的问题。我必须更改git命令中使用的网址以包含我的用户名。

git push https://YOUR_USERNAME_HERE@github.com/mlbileschi/scala.git

然后,当它要求PW时,请使用根据Gergo Erdosi的回答中的说明创建的访问令牌。


1
这对我有用,但是如果我尝试git remote set-url --push origin使用相同的值进行设置,则git push origin master仍然会失败。
Danimal

如Jester所述,在将我的用户名包含在远程路径中之后,它也对我有用。
ovo

在Windows命令提示符下,这对我不起作用,但内部git-bash工作正常
Vincent Tang

在Ubuntu中对我来说非常完美。谢谢!
瑞安·罗素

12

在Linux上,您可以使用SSH密钥对GitHub身份进行身份验证。

1)生成一个新的SSH密钥(来源

打开终端。

粘贴以下文本,替换为您的GitHub电子邮件地址。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

使用提供的电子邮件作为标签,这将创建一个新的ssh密钥。


2)将密钥链接到您的GitHub帐户

打开终端并复制生成的公钥

cat ~/.ssh/id_rsa.pub

应该输出为

ssh-rsa AAAAB3NzaC1y ... mKAKw== your_email@example.com

导航到https://github.com/settings/keys并单击New SSH Key,为其命名,然后复制并粘贴公共密钥。

在此处输入图片说明


3)从更改git origin https://ssh

打开终端,cd到您的存储库位置并输入

git remote set-url origin git@github.com:<github username>/<repository name>

1
是的,但与这个问题无关。通过身份验证https有时会很有用,例如在将https叉子停在上游时保持上游ssh,这样可以避免不小心推向上游,因为这https将要求输入密码并提醒您您针对了错误的回购
品-stelios

您不需要Linux即可使用SSH。我认为,对于Windows而言,使用SSH也是更好的答案。Windows常用的工具是Pagaent和Putty
Andrew

3

这对我有用:

  • 转到[your-git-repo] /。git / config

  • [remote "origin"]URL密钥从http协议更改为git下。

如果值urlhttps://github.com/ git的将其更改为git@github.com:<repo-url>.git


3

如果您已经在使用ssh密钥,则在启用2FA后,它将强制您使用SSH进行远程读写。您实际上并不需要添加个人令牌,而是继续使用现有的SSH密钥对。

只需将您的远程URL从HTTPS更改为SSH:

git remote set-url origin git@github.com:<github-username>/<repo-name>


0

当我为我的一个私有存储库启用2FA(两因素身份验证)时,我在现有存储库上遇到了这个问题。我可以在ubuntu 19.0终端上按照以下步骤解决问题:-

  1. 将您的ssh密钥添加到github,以便您无需再次使用密码,因为现在您已启用2FA。访问github页面,了解如何轻松实现。
  2. 添加密钥后,转到终端,然后更新原始网址

    git remote set-url origin git@github.com:<USERNAME>/<BRANCH-NAME>

就是这样,希望能有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.