启用双因素身份验证后,Git验证失败

141

我刚刚启用了双因素认证(我想不出我所做的其他更改),然后git要求我输入用户名和密码。我提供了两个信息,但是都被认为是"错误的"。我尝试了这里的许多解决方案:Git push requires username and password,但都没有起作用。特别是在从https切换到ssh时,ssh密钥会出现

Permission denied (publickey). fatal: Could not read from remote repository.

$ 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
“Permission denied (publickey). fatal: Could not read from remote repository.” 是一个单独的问题,可以通过为您的帐户设置SSH密钥来解决:https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/。 - Ajedi32
1
往往情况下这不是2FA问题,而是通过从https更改为git来解决的。 - SCBuergel
如果您刚刚设置了GitHub CLI,这个问题就会消失,您将不再被要求进行身份验证。安装并验证GitHub CLI(gh),问题就会消失。首先,按照项目README中的说明下载GH CLI,然后按照手册进行身份验证。按照终端中的说明操作,当GH CLI完成身份验证后,您就不需要再输入密码来进行git push操作了。 - truth
10个回答

187

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

enter image description here

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


嗯,我尝试过将 URL 设置为 https,但没有成功。我还尝试过将 URL 设置回 ssh,并删除 .ssh/known_hosts 条目,但是都无济于事。 - Max Bileschi
你能把命令行输出添加到你的问题中吗?包括你正在执行的命令。 - Gergo Erdosi
我遇到了一个奇怪的问题,需要开始克隆并输入我的新访问令牌。在此之后(甚至没有等待克隆完成),我就能够将我的新访问令牌提供给我原来尝试运行git pull的目录。可能是本地问题,但这可能会帮助某些人。 - s g
1
当我使用密码令牌进行https推送时,会收到“请求的URL返回错误:403”的错误提示。 - stelios
从安全角度考虑:如果有人拿到了我的本地代码库副本,随后获取了远程URL,那么他或她就可以访问GitHub帐户,如果我不知道的话,我将无法及时撤销密钥。不缓存密码会更安全吗? - niid
对我没用。但是像@Yulian建议的那样更新git却完美地解决了问题。 - N4ppeL

49

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

  1. 向 Gergo Erdosi 致敬. 他的回答在很大程度上是正确的,只是 Github 更改了那个设置页面。截至2016年底,您需要从个人访问令牌页生成一个访问令牌。

    enter image description here

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

  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 私钥一样安全。注意:请记住,如果您在该计算机上还使用其他没有2FA的 git 帐户,那些实际密码也将以纯文本形式存储。

PS: 或者,您可以选择使用基于ssh的登录方式,使用一个受口令保护的 ssh 私钥,这样更加安全但不太方便,但这超出了本答案的范围。


1
这对我很有用,使我不必每次与git交互时都输入用户名和密码。我使用带有Cygwin的Windows,并且以前从未能够让SSH密钥正常工作 - 现在可以了! - liltitus27
关于最后一段:“...凭据不是您的真实密码,而是一个随机生成的字符串。因此,它与使用ssh私钥一样安全。” ——这完全不是真的。SSH密钥可以通过默认设置中的“口令短语”轻松保护。而明文的~./git-credentials则根本没有安全性! - maxkoryukov
@maxkoryukov 好的,我可以将最后一句话改为“和使用无密码ssh私钥一样安全”吗?因为第三步的整个目的是尝试绕过密码提示(当然假设你在自己的电脑上工作)。在这种情况下,如果有人获取了您的~/.git-credentials或者您的无密码ssh私钥,后果将是相同的。我同意您的观点,即带有密码保护的ssh密钥会更安全(但不太方便)。 - RayLuo
@RayLuo,LGFM;) - maxkoryukov
@RayLuo 感谢回答。这不是复制粘贴错误,我使用 git remote -v 确保仓库URL正确,并且已经为token添加了所有权限。我似乎已经撤销了它并重新执行了该过程。这似乎是Github的一个bug,我会报告它。也许我不应该对类似你的所有相似答案进行投票,但我无法撤消(SO设定)。 - stelios
显示剩余4条评论

19
您可以设置一个SSH密钥(在Linux和Windows上均可)。

Windows用户请注意
确保定义并设置了HOME环境变量,指向您的用户目录
例如:C:\Users\jossef了解更多


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

打开终端/cmd并粘贴下面的文本(将其中的电子邮件地址替换为您的GitHub电子邮件地址)

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

2) 将公钥链接到您的GitHub账户

  • On Linux / macOS, run in terminal:

    cat ~/.ssh/id_rsa.pub
    
  • On Windows, run in cmd:

    type %HOME%\.ssh\id_rsa.pub
    
这将输出公钥:
ssh-rsa AAAAB3NzaC1y ... mKAKw== your_email@example.com

转到https://github.com/settings/keys

  • 点击New SSH Key
  • 为它命名
  • 复制粘贴之前命令输出的公钥

enter image description here


3) 将 git 的源从 https:// 更改为 ssh

打开终端/cmd并cd到你克隆的存储库目录,然后运行:

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

1
真实,但与问题无关。通过https进行身份验证有时很有用,例如在保持上游使用https的同时,将您的分支存储在ssh上,以避免意外推送到上游,因为https会要求输入密码并提醒您目标错误的仓库。 - stelios

17

我有个类似的问题。我需要修改git命令中使用的URL以包含我的用户名。

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

接着当它要求密码时,请使用您通过按照Gergo Erdosi的回答中提供的说明创建的访问令牌。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Danimal
1
在Jester所描述的将我的用户名包含在远程路径中后,这对我也起作用。 - ovo
这在Windows命令提示符中对我没有用,但在git-bash中却可以正常工作。 - Vincent Tang
1
在Ubuntu上完美运行。谢谢! - Ryan Russell
如果您直接在 https://<token>@github 中使用令牌,它仍然可以正常工作。 - Patrick Mutuku

7
如果您已经在使用ssh密钥,在启用2FA后,它将强制您使用SSH进行远程读写。您不需要添加个人令牌,而是继续使用现有的SSH密钥对。
只需将远程URL从HTTPS更改为SSH即可:
git remote set-url origin git@github.com:<github-username>/<repo-name>

4

2021更新

不确定这是否适用于所有人,但将我的Git版本2.27.0更新到最新版(目前为2.30.0),解决了我的问题。而在命令行中尝试使用个人访问令牌作为密码则无法解决。

更新后,当尝试推送时,我被提示通过浏览器登录GitHub,而不是在对话框或命令行中输入我的凭据。


很高兴我能帮到你!祝你编程愉快 :)) - Yulian
1
这肯定是解决这个问题最干净的方案。 - N4ppeL

3
这对我有用:
  • 进入[your-git-repo]/.git/config文件

  • [remote "origin"] 下,将 URL 键从 http 协议改为 git。

示例:

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


1

0

当我切换到一台旧笔记本电脑时,我遇到了这个问题。实际上,问题只是我正在运行一个旧版本的git。一旦我更新到最新版本的git,并使用新的跨平台凭据管理器,它就能够完美地为我签署2FA(看起来它会自动为您创建PAT)。


0

当我为我的一个私有repo启用2FA(双重身份验证)时,我在现有的repo上遇到了这个问题。我能够通过以下步骤在我的ubuntu 19.0终端上解决它:

  1. 将您的ssh密钥添加到github中,这样您就不需要再次使用密码,因为现在您已经启用了2FA。访问github页面以了解如何轻松完成此操作。
  2. 一旦添加了密钥,请转到终端并更新原始URL

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

就是这样。希望它有所帮助。


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