Uwierzytelnianie Git kończy się niepowodzeniem po włączeniu 2FA

102

Właśnie włączyłem 2FA (nie przychodzą mi do głowy żadne inne zmiany, które wprowadziłem) i git poprosił o moją nazwę użytkownika i hasło. Podałem oba, ale były one „złe”. Wypróbowałem wiele rozwiązań tutaj: Git push wymaga nazwy użytkownika i hasła, ale to nie zadziałało. W szczególności przy przełączaniu z https na ssh klucz ssh daje

Odmowa pozwolenia (publickey). krytyczny: nie można odczytać ze zdalnego repozytorium.

$ 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/'

Jakieś wskazówki?

Max Bileschi
źródło
1
„Odmowa dostępu (publickey). Krytyczny: nie można odczytać ze zdalnego repozytorium”. to osobny problem, który można rozwiązać, ustawiając klucz SSH dla swojego konta: help.github.com/articles/…
Ajedi32
1
często nie jest to problem 2FA, ale został rozwiązany poprzez zmianę z https na git
SCBuergel.eth

Odpowiedzi:

137

Musisz wygenerować token dostępu. Możesz je utworzyć, przechodząc do strony ustawień .

wprowadź opis obrazu tutaj

Użyj tego tokena dostępu jako hasła w linii poleceń.

Gergo Erdosi
źródło
hm, próbowałem tego po ustawieniu adresu URL na https i nie zadziałało. Próbowałem też z powrotem ustawić adres URL na ssh i usunąć wpis .ssh / known_hosts, ale bezskutecznie.
Max Bileschi
Czy możesz dodać wyjście wiersza poleceń do swojego pytania? W tym polecenia, które wykonujesz.
Gergo Erdosi
Wyjście zostało dodane
Max Bileschi
Miałem dziwny problem, w którym musiałem rozpocząć klonowanie i wprowadzić mój nowy token dostępu. Po tym (nawet bez czekania na zakończenie klonu) mogłem przekazać mój nowy token dostępu do mojego oryginalnego katalogu, w którym próbowałem uruchomić git pull. Prawdopodobnie problem lokalny, ale może to komuś pomóc.
sg
Otrzymuję, The requested URL returned error: 403gdy używam tokena jako hasła, do wypychania https
stelios
39

Kompleksowe rozwiązanie wymaga 3 kroków.

  1. Uznanie dla Gergo Erdosi. Jego odpowiedź jest w dużej mierze poprawna, po prostu Github zmienia tę stronę ustawień. Od końca 2016 r. Musisz wygenerować token dostępu na swojej stronie osobistych tokenów dostępu .

    wprowadź opis obrazu tutaj

    Użyj tego tokena dostępu jako hasła w linii poleceń.

  2. Możesz utrwalić swoją nazwę użytkownika, dołączając ją do zdalnego adresu URL projektu. Jednym ze sposobów na to jest edycja i .git/configzmodyfikowanie urllinii do następującego formatu:

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

  3. Możesz utrwalić swoje hasło, uruchamiając to tylko raz:

    $ git config credential.helper store

    a następnie twoje przyszłe hasła git będą przechowywane w ~ / .git-credentials, w postaci zwykłego tekstu, w formacie https://user:[email protected].

    Przechowywanie haseł w postaci zwykłego tekstu byłoby zwykle uważane za zagrożenie bezpieczeństwa. Ale w tym przypadku 2FA poświadczenie NIE jest Twoim prawdziwym hasłem, jest to losowo wygenerowany ciąg. Jest to więc tak samo bezpieczne, jak użycie klucza prywatnego ssh i klucza prywatnego SSH bez hasła. OSTRZEŻENIE: pamiętaj, że jeśli zdarzy ci się użyć innego konta (a) git bez 2FA na tym komputerze, te prawdziwe hasła będą również przechowywane w postaci zwykłego tekstu.

PS: Alternatywnie możesz wybrać logowanie oparte na ssh, używając klucza prywatnego ssh chronionego hasłem, co byłoby bezpieczniejsze i mniej wygodne, ale wykracza poza zakres tej odpowiedzi.

RayLuo
źródło
1
to zadziałało dla mnie i pozwoliło mi nie wpisywać un i pw za każdym razem, gdy wchodzę w interakcję z git. używam okien z cygwin i nigdy nie byłem w stanie zmusić kluczy ssh do działania - to działa!
liltitus 27
o ostatnim akapicie: ...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.- to wcale nie jest prawda . Klucze SSH można łatwo chronić hasłem po wyjęciu z pudełka. Zwykły ~./git-credentials- wcale nie jest zabezpieczony!
maxkoryukov
co więcej, ten KLUCZ API przechowywany w pliku zwykłego tekstu umożliwia: dostęp do GitHub API (zależy od zakresu, ale prawdopodobnie każdy, kto ma apikey, będzie miał dostęp do kodu źródłowego repozytorium) i wykonanie dowolnej operacji git (push, pull). Innymi słowy, taki plik z tekstem jawnym to świetny prezent, zwłaszcza jeśli masz dostęp do prywatnych repozytoriów (prawdopodobnie wkrótce staną się publiczne)
maxkoryukov
@maxkoryukov OK, co powiesz na przeformułowanie ostatniego zdania jako „tak bezpieczne, jak użycie klucza prywatnego SSH bez hasła”? Ponieważ celem kroku 3 jest próba ominięcia monitu o hasło (zakładając oczywiście, że pracujesz na własnym komputerze). W takim przypadku, jeśli komuś uda się przechwycić twoje ~ / .git-poświadczenia LUB twój prywatny klucz ssh bez hasła, konsekwencje będą takie same. Zgadzam się z tobą, że klucz ssh chroniony hasłem byłby bezpieczniejszy (i mniej wygodny).
RayLuo
@RayLuo, LGFM;)
maxkoryukov
17

Miałem podobny problem. Musiałem zmienić adres URL używany w poleceniu git, aby zawierał moją nazwę użytkownika.

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

Następnie, gdy zapyta o PW, użyj tokena dostępu, który utworzyłeś zgodnie z instrukcjami w odpowiedzi Gergo Erdosi.

Błazen
źródło
1
to działa dla mnie, ale jeśli spróbuję ustawić git remote set-url --push origintę samą wartość, git push origin masternadal się nie powiedzie.
Danimal
Działa również dla mnie po umieszczeniu mojej nazwy użytkownika w ścieżce zdalnej, zgodnie z opisem Jester.
ovo
To nie działało dla mnie w wierszu poleceń systemu Windows, ale wewnątrz git-bashdziałało dobrze
Vincent Tang
Działało idealnie dla mnie w Ubuntu. Dzięki!
Ryan Russell
Nadal działa, jeśli bezpośrednio użyjesz tokena pod adresem https: // <token> @github ...
Patrick Mutuku
14

Możesz ustawić klucz SSH (w systemie Linux i Windows)

💡 Uwaga dla użytkowników systemu Windows
Upewnij się, że HOMEzmienna środowiskowa jest zdefiniowana i ustawiona w katalogu użytkownika,
np. C:\Users\jossef( Dowiedz się więcej )


1) Generowanie nowego klucza SSH ( źródło )

Otwórz terminal / cmd i wklej poniższy tekst (zastąp swoim adresem e-mail GitHub)

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

2) Połącz klucz publiczny ze swoim kontem GitHub

  • W systemie Linux / macOS uruchom w terminalu:

    cat ~/.ssh/id_rsa.pub
    
  • W systemie Windows uruchom w cmd:

    type %HOME%\.ssh\id_rsa.pub
    

Spowoduje to wyświetlenie klucza publicznego:

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

Przejdź do https://github.com/settings/keys

  • Kliknij New SSH Key
  • Nadaj mu tytuł
  • Kopiuj i wklej klucz publiczny z poprzedniego wyniku polecenia

wprowadź opis obrazu tutaj


3) Zmień źródło git z https://nassh

Otwórz terminal / cmd i cdprzejdź do katalogu sklonowanego repozytorium i uruchom:

git remote set-url origin [email protected]:<github username>/<repository name>
Jossef Harush
źródło
1
To prawda, ale nie ma to związku z pytaniem. Uwierzytelnianie za pośrednictwem httpsjest czasami przydatne, np. Podczas przechodzenia w górę strumienia, httpspodczas gdy twój fork się skończył ssh, aby uniknąć przypadkowego wypchnięcia do wyższego poziomu, ponieważ httpspoprosi o hasło i przypomni ci, że wybrałeś niewłaściwe repozytorium
stelios
3

To zadziałało dla mnie:

  • Przejdź do [your-git-repo] /. Git / config

  • W obszarze [remote "origin"]Zmień URLklucz z protokołu http na git.

Przykład

Jeśli wartość urlto https://github.com/ .git, zmień ją na[email protected]:<repo-url>.git

imsinu9
źródło
3

Jeśli już używasz kluczy ssh, po włączeniu 2FA wymusi to odczyt / zapis zdalny za pomocą SSH. Naprawdę nie musisz dodawać tokenów osobistych, zamiast tego nadal używaj istniejącej pary kluczy SSH.

Po prostu zmień zdalny adres URL z HTTPS na SSH:

git remote set-url origin [email protected]:<github-username>/<repo-name>
Sakhi Mansoor
źródło
0

Miałem problem z istniejącym repozytorium, gdy włączyłem 2FA (uwierzytelnianie dwuskładnikowe) dla jednego z moich prywatnych repozytoriów. Udało mi się to rozwiązać, wykonując poniższe kroki na moim terminalu Ubuntu 19.0: -

  1. Dodaj swój klucz ssh do github , aby nie trzeba było ponownie używać hasła, ponieważ teraz masz włączone 2FA. Odwiedź stronę github, aby dowiedzieć się, jak to łatwo zrobić.
  2. Po dodaniu klucza przejdź do terminala i zaktualizuj pierwotny adres URL

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

To wszystko. Mam nadzieję, że to pomaga

Milind
źródło