Xác thực Git không thành công sau khi bật 2FA


97

Tôi vừa bật 2FA (tôi không thể nghĩ đến bất kỳ thay đổi nào khác mà tôi đã thực hiện) và git đã yêu cầu tên người dùng và mật khẩu của tôi. Tôi đã cung cấp cả hai, nhưng họ đã "sai". Tôi đã thử nhiều giải pháp ở đây: Git push yêu cầu tên người dùng và mật khẩu nhưng điều đó không hoạt động. Đặc biệt, khi chuyển từ https sang ssh, phím ssh cho

Quyền bị từ chối (khóa công khai). nghiêm trọng: Không thể đọc từ kho lưu trữ từ xa.

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

Bất kỳ lời khuyên?


1
"Quyền bị từ chối (khóa công khai). Fat: Không thể đọc từ kho lưu trữ từ xa." là một vấn đề riêng biệt có thể được giải quyết bằng cách thiết lập khóa SSH cho tài khoản của bạn: help.github.com/articles/…
Ajedi32

1
thường thì đây không phải là vấn đề 2FA mà thay vào đó được giải quyết bằng cách thay đổi từ https thành git
SCBuergel.eth Ngày

Câu trả lời:


125

Bạn cần tạo mã thông báo truy cập. Bạn có thể tạo một cái bằng cách vào trang cài đặt của bạn .

nhập mô tả hình ảnh ở đây

Sử dụng mã thông báo truy cập này làm mật khẩu của bạn trong dòng lệnh.


hm, tôi đã thử điều đó sau khi set-url thành https và nó không hoạt động. Tôi cũng đã thử set-url trở lại ssh và xóa mục nhập .ssh / known_hosts, nhưng vô ích.
Max Bileschi

Bạn có thể thêm đầu ra dòng lệnh cho câu hỏi của mình không? Bao gồm các lệnh bạn đang thực hiện.
Gergo Erdosi

Đầu ra đã được thêm vào
Max Bileschi

Tôi đã gặp một số vấn đề kỳ lạ trong đó tôi phải bắt đầu sao chép và nhập mã thông báo truy cập mới của mình. Sau đó (thậm chí không cần đợi quá trình sao chép hoàn tất), tôi đã có thể cấp mã truy cập mới vào thư mục gốc mà tôi đang cố chạy git pull. Có thể là sự cố cục bộ, nhưng điều này có thể giúp ích cho ai đó.
sg

Tôi nhận được The requested URL returned error: 403khi tôi sử dụng mã thông báo cho mật khẩu, để đẩy qua https
stelios

37

Một giải pháp end-to-end có 3 bước.

  1. Kudos cho Gergo Erdosi. Câu trả lời của anh ấy phần lớn là đúng, chỉ là Github thay đổi trang cài đặt đó. Kể từ cuối năm 2016, bạn cần tạo mã thông báo truy cập từ trang Mã thông báo truy cập cá nhân của mình .

    nhập mô tả hình ảnh ở đây

    Sử dụng mã thông báo truy cập này làm mật khẩu của bạn trong dòng lệnh.

  2. Bạn có thể duy trì tên người dùng của mình bằng cách đưa nó vào url từ xa của dự án. Một trong những cách để làm điều đó là chỉnh sửa của bạn .git/configđể sửa đổi urldòng thành định dạng sau:

    url = https://YOUR_USERNAME_HERE@github.com/owner/repo.git

  3. Bạn có thể duy trì mật khẩu của mình bằng cách chạy nó một lần duy nhất:

    $ git config credential.helper store

    và sau đó (các) mật khẩu git trong tương lai của bạn sẽ được lưu trữ trong ~ / .git-credentials, ở dạng bản rõ, sử dụng định dạng https://user:PlaintextPassword@example.com.

    Việc lưu trữ (các) mật khẩu ở dạng bản rõ thường được coi là một rủi ro bảo mật. Nhưng trong trường hợp 2FA này, thông tin đăng nhập KHÔNG phải là mật khẩu thực của bạn, nó là một chuỗi được tạo ngẫu nhiên. Vì vậy, nó an toàn như sử dụng khóa cá nhân ssh một khóa cá nhân ssh không có cụm mật khẩu. CAVEAT: hãy nhớ rằng, nếu bạn cũng sử dụng (các) tài khoản git khác mà không có 2FA trên máy này, (các) mật khẩu thực đó cũng sẽ được lưu trữ trong bản rõ.

Tái bút: Ngoài ra, bạn có thể chọn sử dụng đăng nhập dựa trên ssh, sử dụng khóa cá nhân ssh được bảo vệ bằng cụm mật khẩu, sẽ an toàn hơn và ít thuận tiện hơn, nhưng nó nằm ngoài phạm vi của câu trả lời này.


1
điều này đã làm việc cho tôi và cho phép tôi không phải gõ un và pw mỗi khi tôi tương tác với git. tôi sử dụng windows với cygwin và không bao giờ có thể làm cho các phím ssh hoạt động - điều này đúng!
liltitus27

về câu cuối cùng: ...the credential is NOT your real password, it is a randomly generated string. So it is as secure as using ssh private key.- nó không đúng chút nào . Các khóa SSH có thể được bảo vệ dễ dàng bằng cụm mật khẩu ngoài hộp. Đồng bằng ~./git-credentials- không được bảo mật ở tất cả!
maxkoryukov

hơn nữa, API KEY được lưu trữ trong tệp plaintext này cho phép: truy cập API GitHub (tùy thuộc vào phạm vi, nhưng có thể, mọi người có apikey sẽ có quyền truy cập vào mã nguồn của repo) và thực hiện bất kỳ thao tác git nào (đẩy, kéo). Nói cách khác, chẳng hạn tập tin là một món quà tuyệt vời, đặc biệt, nếu bạn có quyền truy cập vào kho tư nhân (có lẽ, họ sẽ trở thành công rất sớm)
maxkoryukov

@maxkoryukov OK, tôi nói lại câu cuối cùng là "an toàn như sử dụng khóa cá nhân ssh ít cụm mật khẩu" thì sao? Bởi vì toàn bộ điểm của bước 3 là cố gắng bỏ qua lời nhắc nhập mật khẩu (tất nhiên là giả sử bạn đang làm việc trên máy tính của riêng mình). Trong trường hợp như vậy, nếu ai đó quản lý để nắm giữ ~ / .git-thông tin đăng nhập HOẶC khóa cá nhân ssh không có cụm từ mật khẩu của bạn, hậu quả sẽ giống nhau. Tôi đồng ý với bạn rằng khóa ssh được bảo vệ bằng cụm mật khẩu sẽ an toàn hơn (và kém tiện lợi hơn).
RayLuo

@RayLuo, LGFM;)
maxkoryukov

16

Tôi đã có một vấn đề tương tự. Tôi đã phải thay đổi url được sử dụng trong lệnh git để bao gồm tên người dùng của mình.

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

Sau đó, khi nó yêu cầu PW, hãy sử dụng mã thông báo truy cập bạn đã tạo từ việc làm theo hướng dẫn trong câu trả lời của Gergo Erdosi.


1
điều này làm việc cho tôi, nhưng nếu tôi cố gắng đặt git remote set-url --push originvới cùng một giá trị, thì git push origin mastervẫn không thành công.
Danimal

Cũng hoạt động cho tôi sau khi bao gồm tên người dùng của tôi trong đường dẫn từ xa như được mô tả bởi Jester.
ovo

Điều này không hoạt động đối với tôi trong dấu nhắc lệnh của windows, nhưng bên trong git-bashhoạt động tốt
Vincent Tang

Hoạt động hoàn hảo đối với tôi trong Ubuntu. Cảm ơn!
Ryan Russell

12

Trên linux, bạn có thể xác thực danh tính GitHub của mình bằng khóa SSH.

1) Tạo khóa SSH mới ( nguồn )

Mở thiết bị đầu cuối.

Dán văn bản bên dưới, thay thế vào địa chỉ email GitHub của bạn.

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

Thao tác này tạo khóa ssh mới, sử dụng email được cung cấp làm nhãn.


2) Liên kết khóa với tài khoản GitHub của bạn

Mở thiết bị đầu cuối và sao chép khóa công khai đã tạo

cat ~/.ssh/id_rsa.pub

Nên xuất cái gì đó dưới dạng

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

Điều hướng đến https://github.com/settings/keys và nhấp vào New SSH Key, đặt Tiêu đề cho nó và sao chép-dán khóa công khai.

nhập mô tả hình ảnh ở đây


3) Thay đổi nguồn gốc git từ https://thànhssh

Mở thiết bị đầu cuối, cdđến vị trí kho lưu trữ của bạn và nhập

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

1
Đúng, nhưng không liên quan với câu hỏi. Xác thực thông qua httpslà đôi khi hữu ích, ví dụ như khi giữ thượng nguồn trên httpstrong khi có ngã ba qua ssh, do đó bạn tránh vô tình đẩy lên thượng nguồn, vì httpssẽ yêu cầu mật khẩu và nhắc nhở bạn rằng bạn nhắm mục tiêu các repo sai
Stelios

Bạn không cần Linux để sử dụng SSH. Tôi nghĩ rằng sử dụng SSH là câu trả lời tốt hơn cho Windows. Công cụ thường được sử dụng cho windows là Pagaent và Putty
Andrew

3

Điều này đã làm việc cho tôi:

  • Truy cập [your-git-repo] /. Git / config

  • Trong [remote "origin"]Thay đổi URLkhóa từ giao thức http thành git.

Thí dụ

Nếu giá trị của urlhttps://github.com/ .git, hãy thay đổi nó thànhgit@github.com:<repo-url>.git


3

Nếu bạn đang sử dụng khóa ssh, sau khi bật 2FA, nó sẽ buộc bạn đọc / ghi từ xa bằng SSH. Bạn không thực sự cần thêm mã thông báo cá nhân thay vì tiếp tục sử dụng cặp khóa SSH hiện có của mình.

Chỉ cần thay đổi url từ xa của bạn từ HTTPS thành SSH:

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

0

Điều này đã hiệu quả với tôi sau khi bật 2FA trên Github:

  1. Tạo Mã thông báo truy cập cá nhân: https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line .
    LƯU Ý: Hãy nhớ chọn quyền chính xác cho mã thông báo.

  2. Chạy:
    git clone https://github.com/username/repo.git
    Tên người dùng: your_username
    Mật khẩu:your_token

Đọc thêm: https://help.github.com/en/github/using-git/which-remote-url-should-i-use


0

Tôi đã gặp phải vấn đề này trên repo hiện có khi tôi bật 2FA (xác thực hai yếu tố) cho một trong những repo riêng tư của mình. Tôi đã có thể giải quyết nó theo các bước dưới đây trên thiết bị đầu cuối ubuntu 19.0 của mình: -

  1. Thêm khóa ssh của bạn vào github để bạn không cần sử dụng lại mật khẩu của mình, vì bây giờ bạn đã bật 2FA. Truy cập trang github để biết cách thực hiện dễ dàng.
  2. Sau khi khóa được thêm, hãy chuyển đến thiết bị đầu cuối của bạn và cập nhật url gốc

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

Đó là nó, hy vọng nó sẽ giúp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.