启用 2FA 后 Git 身份验证失败
Posted
技术标签:
【中文标题】启用 2FA 后 Git 身份验证失败【英文标题】:Git authentication fails after enabling 2FA 【发布时间】:2014-10-22 09:57:41 【问题描述】:我刚刚启用了 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
不再需要密码。
【参考方案1】:
您需要生成访问令牌。您可以通过转到您的settings page 来创建一个。
在命令行中将此访问令牌用作您的密码。
【讨论】:
hm,我在将 url 设置为 https 后尝试过,但没有成功。我还尝试将 set-url 返回 ssh,并删除 .ssh/known_hosts 条目,但无济于事。 您可以将命令行输出添加到您的问题中吗?包括你正在执行的命令。 我遇到了一些奇怪的问题,我必须开始克隆并输入我的新访问令牌。在此之后(甚至没有等待克隆完成)我能够将我的新访问令牌提供给我试图在其中运行git pull
的原始目录。可能是本地问题,但这可能会对某人有所帮助。
当我使用令牌作为密码时,我得到The requested URL returned error: 403
,用于推送 https
所以只是从安全的角度来看:如果有人掌握了我的本地仓库副本以及随后的远程 url,他或她可以访问 github 帐户,如果我不知道会有我没有办法及时撤销密钥吗?完全不缓存密码不是更安全吗?【参考方案2】:
2021 年更新
不确定这是否适用于所有人,但将我的 git version 从 2.27.0 更新到最新版本(当前为 2.30.0)解决了我的问题,而尝试在命令行中使用个人访问令牌作为密码却没有。
更新后,尝试推送时,系统提示我通过浏览器登录 GitHub,而不是在对话框或命令行中输入我的凭据。
【讨论】:
很高兴能帮上忙!快乐编码:)) 这肯定是解决这个问题最干净的方法【参考方案3】:我在切换到旧笔记本电脑时遇到了这个问题。真正的问题只是我运行的是旧版本的 git。一旦我使用新的跨平台凭证管理器更新到最新版本的 git,它就可以完美地用 2FA 签署我(看起来它会自动为你创建一个 PAT)。
【讨论】:
【参考方案4】:您可以设置 SSH 密钥(在 Linux 和 Windows 上)
? Windows 用户注意事项 确保在您的用户目录中定义并设置了
HOME
环境变量 例如C:\Users\jossef
(learn more)
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 中运行:
type %HOME%\.ssh\id_rsa.pub
这将输出公钥:
ssh-rsa AAAAB3NzaC1y ... mKAKw== your_email@example.com
导航到https://github.com/settings/keys
点击New SSH Key
给它一个标题
复制粘贴上一个命令输出中的公钥
3) 将 git 来源从 https://
更改为 ssh
打开终端 / cmd 和 cd
到您克隆的存储库目录并运行:
git remote set-url origin git@github.com:<github username>/<repository name>
【讨论】:
正确,但与问题无关。通过https
进行身份验证有时很有用,例如,当你的fork 在ssh
上时保持上游超过https
,这样你就可以避免意外推送到上游,因为https
会询问密码并提醒你你的目标错误的回购【参考方案5】:
当我为我的一个私人存储库启用 2FA(双因素身份验证)时,我在现有存储库中遇到了这个问题。 我能够在我的 ubuntu 19.0 终端上按照以下步骤解决它:-
-
将您的 ssh 密钥添加到 github,这样您就不需要再次使用密码了,因为现在您已启用 2FA.Visit github page 知道如何轻松操作。
添加密钥后,转到您的终端,并更新原始 url
git remote set-url origin git@github.com:<USERNAME>/<BRANCH-NAME>
就是这样。希望对你有帮助
【讨论】:
【参考方案6】:在 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
【讨论】:
【参考方案7】:如果您已经在使用 ssh 密钥,则在启用 2FA 后,它将强制您使用 SSH 远程读/写。您实际上不需要添加个人令牌,而是继续使用现有的 SSH 密钥对。
只需将您的远程 URL 从 HTTPS 更改为 SSH:
git remote set-url origin git@github.com:<github-username>/<repo-name>
【讨论】:
【参考方案8】:这对我有用:
转到 [your-git-repo]/.git/config
在[remote "origin"]
下将URL
键从http 协议更改为git。
例子
如果url
的值为https://github.com/.git,则将其更改为git@github.com:<repo-url>.git
【讨论】:
【参考方案9】:端到端解决方案需要 3 个步骤。
向 Gergo Erdosi 致敬。他的回答基本上是对的,只是 Github 改变了那个设置页面。截至 2016 年底,您需要从您的 Personal access tokens page生成访问令牌。
在命令行中使用此访问令牌作为您的密码。
您可以通过将用户名包含到您的项目远程 url 中来保留您的用户名。一种方法是编辑您的.git/config
以将url
行修改为以下格式:
url = https://YOUR_USERNAME_HERE@github.com/owner/repo.git
您只需运行一次即可保留您的密码:
$ git config credential.helper store
然后您未来的 git 密码将存储在 ~/.git-credentials 中,以纯文本格式,格式为 https://user:PlaintextPassword@example.com
。
以明文形式存储密码通常会被视为安全风险。但在这种 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 操作(推、拉)。换句话说,这样的 plaintext 文件是一个很棒的礼物,尤其是如果您可以访问私有存储库(可能很快就会公开)
@maxkoryukov 好的,我将最后一句话改写为“与使用无密码的 ssh 私钥一样安全”怎么样?因为第 3 步的重点是试图绕过密码提示(当然,假设您在自己的计算机上工作)。在这种情况下,如果有人设法获得了您的 ~/.git-credentials 或您的无密码 ssh 私钥,结果将是相同的。我同意你的观点,受密码保护的 ssh 密钥会更安全(也更不方便)。
@RayLuo, LGFM;)【参考方案10】:
我遇到了类似的问题。我必须更改 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://以上是关于启用 2FA 后 Git 身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 9 + Asp.net Core Web API 中启用 Windows 身份验证后,预检(选项)请求失败