Sửa lỗi 'fatal: Authentication failed' khi dùng GitHub HTTPS — Windows Credential Manager lưu thông tin cũ

beginner🪟 Windows2026-06-20| Windows 10 / Windows 11, Git for Windows 2.x, GitHub HTTPS remote

Error Message

fatal: Authentication failed for 'https://github.com/username/repo.git/'
#git#github#credential-manager#xác thực#windows

Lỗi gặp phải

fatal: Authentication failed for 'https://github.com/username/repo.git/'

Lỗi này xuất hiện hoàn toàn bất ngờ. Bạn đã push lên cùng một repo suốt nhiều tháng, mọi thứ vẫn chạy tốt — rồi một buổi sáng mọi lệnh git pushgit pull đều thất bại với thông báo này. Không có thay đổi code. Không có thay đổi cấu hình. Không có gì rõ ràng cả.

Trên Windows, thủ phạm hầu như luôn là Windows Credential Manager đang lưu giữ một token GitHub cũ hoặc mật khẩu mà GitHub đã ngừng chấp nhận. Xóa mục thông tin xác thực đã cache đó là bạn có thể tiếp tục làm việc trong vòng hai phút.

Nguyên nhân

Windows Credential Manager lưu thông tin xác thực GitHub của bạn ngay lần đầu đăng nhập — để bạn không phải gõ lại mỗi lần push. Điều đó tiện lợi cho đến khi thông tin xác thực đã lưu bị hết hạn. Các nguyên nhân phổ biến:

  • Bạn đã xoay vòng hoặc thu hồi một Personal Access Token (PAT) trên GitHub
  • Mật khẩu tài khoản GitHub của bạn đã thay đổi
  • Bạn chuyển từ xác thực bằng mật khẩu sang PAT — GitHub đã khai tử xác thực HTTPS bằng mật khẩu vào tháng 8 năm 2021
  • Bạn chuyển đổi giữa nhiều tài khoản GitHub trên cùng một máy

Một khi bất kỳ điều nào trong số đó xảy ra, Git tiếp tục âm thầm gửi thông tin xác thực cũ. GitHub từ chối mỗi lần. Do đó xuất hiện lỗi fatal: Authentication failed.

Hướng dẫn khắc phục từng bước

Cách 1: Xóa qua giao diện Windows Credential Manager (Dễ nhất)

  • Mở Start → tìm kiếm Credential Manager → mở ứng dụng.
  • Nhấp vào tab Windows Credentials.
  • Tìm các mục bắt đầu bằng git:https://github.com hoặc chỉ là GitHub.
  • Nhấp vào mục đó → nhấp Remove → xác nhận.
  • Chạy lại git push — Windows sẽ yêu cầu nhập thông tin xác thực mới.

Cách 2: Xóa qua dòng lệnh (Nhanh hơn)

Mở PowerShell hoặc Command Prompt và chạy:

cmdkey /delete:LegacyGeneric:target=git:https://github.com

Không chắc tên target chính xác? Liệt kê tất cả những mục liên quan đến GitHub trước:

cmdkey /list | findstr /i github

Sao chép tên target từ kết quả đầu ra, sau đó xóa nó:

cmdkey /delete:LegacyGeneric:target=git:https://github.com

Cách 3: Dùng trực tiếp Git Credential Helper

Git Credential Manager có lệnh xóa riêng. Chạy lệnh này trong terminal:

git credential-manager erase

Sau đó gõ những dòng sau — đúng như hiển thị — và nhấn Enter hai lần để gửi EOF:

protocol=https
host=github.com

Trên các phiên bản Git cũ hơn (trước 2.29) chưa có GCM, hãy dùng lệnh cấp thấp hơn thay thế:

git credential reject
protocol=https
host=github.com
username=your-github-username

Xác thực lại bằng PAT

Sau khi xóa thông tin xác thực cũ, lệnh git push tiếp theo sẽ hỏi tên người dùng và mật khẩu. Dừng lại ở đây — đừng nhập mật khẩu tài khoản GitHub của bạn. GitHub đã ngừng chấp nhận mật khẩu cho HTTPS từ tháng 8 năm 2021. Bạn cần một Personal Access Token thay thế:

  • Vào GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic).
  • Nhấp Generate new token (classic).
  • Đặt tên cho token, thiết lập thời hạn (90 ngày là mặc định hợp lý), và tích vào scope repo. Thêm workflow nếu bạn push các file cấu hình GitHub Actions.
  • Sao chép token ngay lập tức — GitHub chỉ hiển thị nó một lần duy nhất.
  • Khi Git yêu cầu mật khẩu, dán token vào đó (không phải vào ô tên người dùng).

Windows Credential Manager sẽ tự động lưu token mới. Những lần push tiếp theo sẽ thực hiện được mà không cần nhập lại.

Cách 4: Chuyển sang SSH (Giải pháp vĩnh viễn)

Mệt mỏi với việc token hết hạn? SSH không có vấn đề này. Một lệnh duy nhất để chuyển đổi remote của bạn:

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

Bạn cần thêm SSH key vào tài khoản GitHub trước. Sau đó, xác thực diễn ra hoàn toàn tự động và không cần token mãi mãi.

Xác nhận đã sửa xong

Push một thứ gì đó nhỏ để kiểm tra:

git push origin main

Hoặc kiểm tra mà không cần push gì cả:

git ls-remote origin

Nếu nó liệt kê các refs — HEAD, branches, tags — mà không có lỗi, bạn đã xong. Muốn xác nhận những gì hiện đang lưu trong Credential Manager?

cmdkey /list | findstr /i github

Bạn sẽ thấy một mục mới. Mục cũ đã hết hạn sẽ biến mất.

Mẹo hay

Token PAT hết hạn là nguyên nhân tái diễn chính. Khi tạo token, GitHub cho bạn đặt thời hạn 7, 30, 60, hoặc 90 ngày — hoặc không có hạn. Token không có hạn thì tiện nhưng là rủi ro bảo mật. Tôi thường đặt 90 ngày và thêm nhắc nhở lịch trước 10 ngày so với ngày hết hạn. Nếu không bạn sẽ gặp lỗi này giữa chừng khi đang push, đang demo, vào đúng lúc tệ nhất.

Bảo vệ PAT như mật khẩu của bạn. Một token với scope repo có toàn quyền đọc/ghi đối với tất cả repo riêng tư của bạn. Đừng dán nó lên Slack, đừng hardcode trong script, đừng commit ở bất kỳ đâu. Nếu bạn cần tạo token ngẫu nhiên mạnh cho các mục đích khác — API keys, test secrets — tôi dùng trình tạo mật khẩu của ToolCraft, chạy hoàn toàn trên trình duyệt mà không upload gì lên server.

Nhiều tài khoản GitHub trên một máy là vấn đề riêng đáng đau đầu. Credential Manager chỉ lưu một mục cho mỗi host, nên các tài khoản sẽ xung đột nhau. SSH với các host alias khác nhau trong ~/.ssh/config xử lý vấn đề này gọn gàng — mỗi project trỏ đến một alias khác nhau, mỗi alias ánh xạ đến một key khác nhau, và không có xung đột thông tin xác thực.

Nếu vấn đề cứ lặp lại sau khi bạn đã xóa thông tin xác thực, hãy kiểm tra cấu hình credential helper:

git config --global credential.helper

Các bản cài đặt Git for Windows hiện đại sẽ hiển thị manager. Nếu bạn thấy wincred, store, hoặc không có gì cả, đó có thể là nguyên nhân gây ra hành vi cache không nhất quán — và đáng sửa trước khi chu kỳ hết hạn tiếp theo ập đến.

Related Error Notes