ChatGPT解决这个技术问题 Extra ChatGPT

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

我刚刚启用了 2FA(我想不出我所做的任何其他更改)并且 git 询问我的用户名和密码。我提供了两者,但它们是“错误的”。我在这里尝试了许多解决方案:Git push requires username and password,但没有奏效。特别是当从 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/'

有小费吗?

“权限被拒绝(公钥)。致命:无法从远程存储库中读取。”是一个单独的问题,可以通过为您的帐户设置 SSH 密钥来解决:help.github.com/articles/…
通常这不是 2FA 问题,而是通过从 https 更改为 git 来解决
如果您只是设置 GitHub CLI,这个问题就会消失,并且不再要求您进行身份验证。安装并验证 GitHub CLI (gh),问题就消失了。首先,使用 the project README 中的说明下载 GH CLI,然后按照 manual 进行身份验证。按照终端中的说明进行操作,当 GH CLI 完成身份验证后,您不再需要 git push 的密码。

b
brianlmerritt

您需要生成访问令牌。您可以转到 settings page 创建一个。

https://i.stack.imgur.com/OSWdi.png

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


嗯,我在将 URL 设置为 https 后尝试过,但它没有用。我还尝试将 set-url 返回 ssh,并删除 .ssh/known_hosts 条目,但无济于事。
您可以将命令行输出添加到您的问题中吗?包括您正在执行的命令。
我遇到了一些奇怪的问题,我必须开始克隆并输入我的新访问令牌。在此之后(甚至没有等待克隆完成),我能够将我的新访问令牌提供给我试图在其中运行 git pull 的原始目录。可能是本地问题,但这可能会对某人有所帮助。
当我使用令牌作为密码时,我得到 The requested URL returned error: 403,用于推送 https
所以只是从安全的角度来看:如果有人掌握了我的本地仓库副本以及随后的远程 url,他或她可以访问 github 帐户,如果我不知道,我将无法撤销密钥及时?根本不缓存密码不是更安全吗?
R
RayLuo

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

感谢 Gergo Erdosi。他的回答基本上是对的,只是 Github 改变了那个设置页面。截至 2016 年底,您需要从个人访问令牌页面生成访问令牌。在命令行中将此访问令牌用作您的密码。您可以通过将用户名包含到您的项目远程 url 中来保留您的用户名。一种方法是编辑您的 .git/config 以将 url 行修改为以下格式: url = https://YOUR_USERNAME_HERE@github.com/owner/repo.git 您可以通过运行此命令来保留您的密码仅限一次:$ git config credential.helper store,然后您未来的 git 密码将使用格式 https://user:PlaintextPassword@example.com 以纯文本形式存储在 ~/.git-credentials 中。以明文形式存储密码通常会被视为安全风险。但在这种 2FA 案例中,凭证不是您的真实密码,它是一个随机生成的字符串。因此,它与使用 ssh 私钥和无密码 ssh 私钥一样安全。警告:请记住,如果您碰巧在这台机器上使用了另一个没有 2FA 的 git 帐户,那么这些真实密码也将以明文形式存储。

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


这对我有用,使我不必每次与 git 交互时都输入 un 和 pw 。我在 cygwin 中使用 windows 并且永远无法让 ssh 密钥工作 - 确实如此!
关于最后一段:...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.这根本不是真的。开箱即用的 passphrase 可以轻松保护 SSH 密钥。普通的 ~./git-credentials — 根本不安全!
此外,存储在明文文件中的这个 API KEY 允许:访问 GitHub API(取决于范围,但可能每个拥有 apikey 的人都可以访问 repo 的源代码)并执行任何 git 操作(推送、拉取)。换句话说,这样的纯文本文件是一个很棒的礼物,尤其是如果您可以访问私有存储库(可能很快就会公开)
@maxkoryukov 好的,我将最后一句话改写为“与使用无密码的 ssh 私钥一样安全”怎么样?因为第 3 步的重点是试图绕过输入密码的提示(当然,假设您在自己的计算机上工作)。在这种情况下,如果有人设法获得了您的 ~/.git-credentials 或您的无密码 ssh 私钥,结果将是相同的。我同意你的观点,受密码保护的 ssh 密钥会更安全(也更不方便)。
@RayLuo,LGFM;)
J
Jossef Harush Kadouri

您可以设置 SSH 密钥(在 Linux 和 Windows 上)

💡 Windows 用户注意事项确保 HOME 环境变量已定义并设置在您的用户目录中,例如 C:\Users\jossef(了解更多)

1) 生成新的 SSH 密钥 (source)

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

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

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

在 Linux / macOS 上,在终端中运行:cat ~/.ssh/id_rsa.pub

在 Windows 上,在 cmd 中运行:键入 %HOME%\.ssh\id_rsa.pub

这将输出公钥:

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

导航到 https://github.com/settings/keys

单击新建 SSH 密钥

给它一个标题

复制粘贴上一个命令输出中的公钥

https://i.stack.imgur.com/gVrFW.png

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

打开终端 / cmd 和 cd 到您克隆的存储库目录并运行:

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

没错,但与问题无关。通过 https 进行身份验证有时很有用,例如,当您的 fork 在 ssh 上保持上游超过 https 时,这样您就可以避免意外推送到上游,因为 https 会要求输入密码并提醒您定位错误的回购
J
Jester

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

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

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


这对我有用,但是如果我尝试将 git remote set-url --push origin 设置为相同的值,那么 git push origin master 仍然会失败。
在 Jester 描述的远程路径中包含我的用户名后,也适用于我。
这在 Windows 命令提示符下对我不起作用,但在 git-bash 内部工作正常
在 Ubuntu 中非常适合我。谢谢!
如果您直接使用 https://@github ...
S
Sakhi Mansoor

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

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

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

Y
Yulian

2021 年更新

不确定这是否适用于所有人,但将我的 git version2.27.0 更新到最新版本(当前为 2.30.0)解决了我的问题,同时尝试在命令行中使用个人访问令牌作为密码没有。

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


很高兴我能帮上忙!快乐编码:))
这肯定是解决这个问题的最干净的方法
i
imsinu9

这对我有用:

转到 [your-git-repo]/.git/config

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

例子

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


O
Ofek Hod

在 Github 上启用 2FA 后,这对我有用:

创建个人访问令牌:https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line。注意:请记住为令牌选择正确的权限。运行:git clone https://github.com/username/repo.git 用户名:your_username 密码:your_token

进一步阅读:https://help.github.com/en/github/using-git/which-remote-url-should-i-use


M
Milind

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

将您的 ssh 密钥添加到 github,这样您就不需要再次使用密码了,因为现在您已经启用了 2FA。访问 github 页面以了解如何轻松完成。添加密钥后,转到您的终端,并更新原始 url git remote set-url origin git@github.com:/

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


J
Jason Masters

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