A autenticação Git falha após habilitar 2FA

97

Acabei de habilitar 2FA (não consigo pensar em nenhuma outra alteração que fiz) e git pediu meu nome de usuário e senha. Eu forneci os dois, mas eles estavam "errados". Tentei muitas das soluções aqui: Git push requer nome de usuário e senha, mas não funcionou. Em particular, ao mudar de https para ssh, a chave ssh fornece

Permissão negada (publickey). fatal: não foi possível ler do repositório remoto.

$ 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://[email protected]': 
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/mlbileschi/scala.git/'

Alguma dica?

Max Bileschi
fonte
1
"Permissão negada (publickey). Fatal: Não foi possível ler do repositório remoto." é um problema separado que pode ser resolvido configurando uma chave SSH para sua conta: help.github.com/articles/…
Ajedi32
1
muitas vezes isso não é um problema de 2FA, mas resolvido mudando de https para git
SCBuergel.eth

Respostas:

125

Você precisa gerar um token de acesso. Você pode criar um acessando a página de configurações .

insira a descrição da imagem aqui

Use este token de acesso como sua senha na linha de comando.

Gergo Erdosi
fonte
Hm, tentei fazer isso após set-url para https e não funcionou. Também tentei set-url de volta para ssh e removendo a entrada .ssh / known_hosts, mas sem sucesso.
Max Bileschi
Você pode adicionar a saída da linha de comando à sua pergunta? Incluindo os comandos que você está executando.
Gergo Erdosi
A saída foi adicionada
Max Bileschi de
Tive um problema estranho em que tive que começar um clone e inserir meu novo token de acesso. Depois disso (sem nem mesmo esperar a conclusão do clone), consegui fornecer meu novo token de acesso ao diretório original em que estava tentando executar git pull. Provavelmente um problema local, mas isso pode ajudar alguém.
sg
Recebo The requested URL returned error: 403quando uso o token para senha, para push over https
stelios
38

Uma solução ponta a ponta leva 3 etapas.

  1. Parabéns a Gergo Erdosi. Sua resposta está quase certa, é apenas que o Github muda essa página de configuração. No final de 2016, você precisa gerar um token de acesso em sua página de tokens de acesso pessoais .

    insira a descrição da imagem aqui

    Use este token de acesso como sua senha na linha de comando.

  2. Você pode manter seu nome de usuário incluindo-o na url remota do projeto. Uma das maneiras de fazer isso é editar seu .git/configpara modificar a urllinha no seguinte formato:

    url = https://[email protected]/owner/repo.git

  3. Você pode manter sua senha executando isto apenas uma vez:

    $ git config credential.helper store

    e então suas futuras senhas git serão armazenadas em ~ / .git-credentials, em texto simples, usando o formato https://user:[email protected].

    Armazenar senha (s) em texto sem formatação normalmente seria considerado um risco de segurança. Mas neste caso 2FA, a credencial NÃO é sua senha real, é uma string gerada aleatoriamente. Portanto, é tão seguro quanto usar uma chave privada ssh uma chave privada ssh sem senha. CAVEAT: tenha em mente que, se acontecer de você usar outra (s) conta (s) git sem 2FA nesta máquina, essas senhas reais também serão armazenadas em texto simples.

PS: Alternativamente, você pode escolher usar login baseado em ssh, usando uma chave privada ssh protegida por senha, que seria mais segura e menos conveniente, mas está fora do escopo desta resposta.

RayLuo
fonte
1
Isso funcionou para mim e me permitiu não ter que digitar un e pw toda vez que interagir com o git. eu uso o windows com cygwin e nunca foi capaz de fazer as chaves ssh funcionarem - isso funciona!
liltitus27 de
sobre o último parágrafo: ...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.- não é verdade . As chaves SSH podem ser facilmente protegidas por uma frase secreta pronta para uso. Simples ~./git-credentials- não está protegido de forma alguma!
maxkoryukov
além disso, esta chave de API armazenada em arquivo de texto simples permite: acessar a API do GitHub (depende do escopo, mas provavelmente todos que tiverem apikey terão acesso ao código-fonte do repo) e executar qualquer operação git (push, pull). Em outras palavras, esse arquivo de texto simples é um presente incrível, especialmente se você tiver acesso a repositórios privados (provavelmente, eles se tornarão públicos muito em breve)
maxkoryukov
@maxkoryukov OK, que tal reformular a última frase como "tão seguro quanto usar uma chave privada ssh sem senha"? Porque todo o ponto da etapa 3 é tentar ignorar o prompt de senha (supondo que você esteja trabalhando em seu próprio computador, é claro). Nesse caso, se alguém conseguir obter suas credenciais ~ / .git-credentials OU sua chave privada ssh sem senha, a consequência será a mesma. Eu concordo com você que uma chave ssh protegida por senha seria mais segura (e menos conveniente).
RayLuo
@RayLuo, LGFM;)
maxkoryukov de
16

Eu tive um problema parecido. Tive que alterar o url usado no comando git para incluir meu nome de usuário.

git push https://[email protected]/mlbileschi/scala.git

Então, quando ele perguntar por PW, use o token de acesso que você criou seguindo as instruções na resposta de Gergo Erdosi.

Bobo da corte
fonte
1
isso funciona para mim, mas se eu tento configurar git remote set-url --push origincom o mesmo valor, git push origin masterainda falha.
Danimal
Também funciona para mim depois de incluir meu nome de usuário no caminho remoto, conforme descrito por Jester.
ovo
Isso não funcionou para mim no prompt de comando do Windows, mas dentro git-bashfuncionou bem
Vincent Tang
Funcionou perfeitamente para mim no Ubuntu. Obrigado!
Ryan Russell
12

No Linux, você pode autenticar sua identidade GitHub usando uma chave SSH.

1) Gerando uma nova chave SSH ( fonte )

Abra o terminal.

Cole o texto abaixo, substituindo em seu endereço de e-mail do GitHub.

ssh-keygen -t rsa -b 4096 -C "[email protected]"

Isso cria uma nova chave ssh, usando o e-mail fornecido como um rótulo.


2) Vinculando a chave à sua conta GitHub

Abra o terminal e copie a chave pública gerada

cat ~/.ssh/id_rsa.pub

Deve produzir algo como

ssh-rsa AAAAB3NzaC1y ... mKAKw== [email protected]

Navegue até https://github.com/settings/keys e clique em New SSH Key, atribua um Título e copie e cole a chave pública.

insira a descrição da imagem aqui


3) Altere a origem do git de https://parassh

Abra o terminal, cdpara o local do seu repositório e digite

git remote set-url origin [email protected]:<github username>/<repository name>
Jossef Harush
fonte
1
Verdade, mas irrelevante com a pergunta. Autenticado via httpsàs vezes é útil, por exemplo, quando mantendo a montante sobre httpsao ter seu garfo sobre ssh, para que você evite acidentalmente empurrando para montante, uma vez que httpsirá pedir a senha e lembrar que você alvo o repo errado
stelios
Você não precisa do Linux para usar o SSH. Usar SSH é a melhor resposta para o Windows também, eu acho. A ferramenta comumente usada para janelas é Pagaent e Putty
Andrew,
3

Isso funcionou para mim:

  • Vá para [your-git-repo] /. Git / config

  • Em [remote "origin"]Alterar a URLchave do protocolo http para git.

Exemplo

Se o valor de urlfor https://github.com/ .git, altere-o para[email protected]:<repo-url>.git

imsinu9
fonte
3

Se você já estiver usando chaves ssh, após habilitar 2FA, será forçado a ler / gravar remotamente com SSH. Você realmente não precisa adicionar tokens pessoais, em vez de continuar usando seu par de chaves SSH existente.

Basta alterar seu url remoto de HTTPS para SSH:

git remote set-url origin [email protected]:<github-username>/<repo-name>
Sakhi Mansoor
fonte
0

Eu estava enfrentando esse problema no repo existente quando habilitei 2FA (autenticação de dois fatores) para um de meus repos privados. Consegui resolvê-lo seguindo as etapas abaixo no meu terminal ubuntu 19.0: -

  1. Adicione sua chave ssh ao github para que você não precise usar sua senha novamente, pois agora você habilitou o 2FA. Visite a página do github para saber como fazer isso facilmente.
  2. Assim que a chave for adicionada, vá para o seu terminal e atualize o url de origem

    git remote set-url origin [email protected]:<USERNAME>/<BRANCH-NAME>

É isso. Espero que ajude

Milind
fonte