Chuyện gì vừa xảy ra?
Bạn chạy git push, nhập mật khẩu GitHub, rồi nhận được thông báo này:
remote: Support for password authentication was removed on August 13, 2021.
fatal: Authentication failed for 'https://github.com/user/repo.git/'
GitHub đã khai tử xác thực bằng mật khẩu thông thường cho các thao tác Git từ tháng 8 năm 2021 — đây là quyết định bảo mật nhằm chống lại các cuộc tấn công credential stuffing. Credential cache của bạn vẫn đang lưu mật khẩu cũ. Mọi lệnh push và pull đều thất bại cho đến khi bạn thay thế bằng Personal Access Token (PAT) hoặc chuyển sang SSH.
Tại sao lỗi này xảy ra
Trước tháng 8 năm 2021, bạn có thể push lên GitHub qua HTTPS bằng mật khẩu tài khoản. GitHub đã tắt tính năng này để giảm thiểu nguy cơ tài khoản bị chiếm đoạt từ các mật khẩu bị rò rỉ. PAT có phạm vi giới hạn và có thể thu hồi — nếu một token bị lộ, bạn chỉ cần thu hồi đúng token đó mà không cần thay đổi mật khẩu tài khoản.
Vấn đề hiện tại: trình quản lý credential trên hệ điều hành của bạn đang cache mật khẩu cũ. Git liên tục gửi lại mật khẩu đó. GitHub liên tục từ chối. Đó là vòng lặp bạn đang mắc kẹt.
Cách khắc phục nhanh: tạo Personal Access Token
Hai bước — tạo token trên GitHub, sau đó dùng nó như mật khẩu.
Bước 1 — Tạo PAT trên GitHub
- Vào GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic).
- Nhấp Generate new token (classic).
- Đặt tên dễ nhận biết (ví dụ:
work-laptop-2025) và đặt ngày hết hạn — 90 ngày là mặc định hợp lý. - Trong phần Scopes, tích chọn repo (toàn quyền kiểm soát repository riêng tư). Đó là tất cả những gì bạn cần để push và pull.
- Nhấp Generate token và sao chép ngay lập tức. GitHub chỉ hiển thị token một lần duy nhất.
Token của bạn sẽ bắt đầu bằng ghp_ và dài khoảng 40 ký tự. Đó là mật khẩu mới của bạn.
Bước 2 — Dùng token làm mật khẩu
Chạy lại lệnh push. Khi Git yêu cầu thông tin đăng nhập, nhập:
- Username: tên người dùng GitHub của bạn
- Password: dán token vào (không phải mật khẩu tài khoản)
git push origin main
Username for 'https://github.com': your-username
Password for 'https://your-username@github.com': ghp_xxxxxxxxxxxxxxxxxxxx
Nếu push thành công, cách khắc phục tức thời đã hoạt động. Tuy nhiên Git sẽ hỏi lại ở lần push tiếp theo — đọc tiếp để lưu token vĩnh viễn.
Khắc phục vĩnh viễn: lưu token vào credential store
Tùy chọn A — Git Credential Manager (khuyên dùng)
Git Credential Manager (GCM) lưu trữ token của bạn an toàn trong keychain của hệ điều hành và tự động xử lý xác thực lại. Nó đi kèm với Git for Windows và dễ dàng cài đặt trên macOS và Linux.
Windows — GCM đã được tích hợp sẵn với Git for Windows. Push một lần, cửa sổ trình duyệt mở ra để xác thực, và Git nhớ token của bạn cho đến khi hết hạn.
macOS:
brew install --cask git-credential-manager
git-credential-manager configure
Linux (Debian/Ubuntu) — tải file .deb mới nhất từ trang releases của GCM, sau đó:
sudo dpkg -i gcm-linux_amd64.X.X.X.deb
git-credential-manager configure
Sau khi cài đặt GCM, xóa mật khẩu cache cũ để GCM có thể lưu token mới:
git credential reject
protocol=https
host=github.com
(Chạy lệnh, nhấn Enter, nhập từng dòng, sau đó nhấn Enter ở dòng trống để kết thúc.)
Push lại. GCM hỏi một lần, lưu token, và bạn sẽ không bị hỏi lại trong suốt thời gian token còn hiệu lực.
Tùy chọn B — Nhúng token vào URL remote
Không có credential manager? Đưa token trực tiếp vào URL remote:
git remote set-url origin https://YOUR_TOKEN@github.com/user/repo.git
Git đọc tự động trong mỗi lần push và pull. Không cần nhập thủ công, không cần cài đặt thêm.
Lưu ý: token nằm dưới dạng văn bản thuần túy bên trong .git/config. Bất kỳ ai đọc được file đó đều có thể dùng token của bạn. Tránh dùng cách này trên máy dùng chung hoặc máy công cộng.
Tùy chọn C — Chuyển sang SSH
SSH key không hết hạn và không cần nhập gì sau khi đã cấu hình. Nếu bạn push lên GitHub mỗi ngày, công sức thiết lập một lần sẽ hoàn toàn xứng đáng.
# Tạo key (bỏ qua nếu ~/.ssh/id_ed25519 đã tồn tại)
ssh-keygen -t ed25519 -C "you@example.com"
# In public key ra màn hình
cat ~/.ssh/id_ed25519.pub
Sao chép kết quả đó và dán vào GitHub → Settings → SSH and GPG keys → New SSH key. Sau đó trỏ remote của bạn sang SSH:
git remote set-url origin git@github.com:user/repo.git
Kiểm tra kết nối trước khi push lần tiếp theo:
ssh -T git@github.com
# Hi your-username! You've successfully authenticated...
Xóa mật khẩu cache bị lỗi
Vẫn thấy Authentication failed sau khi đã tạo token? Hệ điều hành đang gửi lại mật khẩu cache cũ trước khi Git kịp hỏi. Xóa cache theo từng nền tảng:
Windows (Credential Manager):
git credential-manager erase
protocol=https
host=github.com
Hoặc: mở Control Panel → Credential Manager → Windows Credentials và xóa bất kỳ mục nào liên quan đến github.com.
macOS (Keychain):
git credential-osxkeychain erase
protocol=https
host=github.com
Hoặc mở Keychain Access, tìm kiếm github.com, và xóa mục đó thủ công.
Linux (store helper):
git config --global credential.helper store
Sau đó mở ~/.git-credentials bằng trình soạn thảo văn bản và xóa dòng chứa github.com.
Kiểm tra kết quả
Push thứ gì đó nhỏ để xác nhận mọi thứ hoạt động:
git push origin main
Kết quả thành công trông như sau:
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
To https://github.com/user/repo.git
a1b2c3d..e4f5g6h main -> main
Không còn Authentication failed. Xong.
Để kiểm tra credential helper nào Git đang dùng hiện tại:
git config --global credential.helper
Mẹo bảo mật token
- Đặt ngày hết hạn. 90 ngày là mặc định hợp lý. GitHub gửi email cho bạn một tuần trước khi hết hạn, nên bạn sẽ không bị bất ngờ giữa chừng công việc.
- Dùng phạm vi tối thiểu. Với hầu hết repository cá nhân,
repolà tất cả những gì bạn cần. Đừng cấp quyền nhiều hơn mức cần thiết. - Không bao giờ commit token. Nếu một token lọt vào commit, hãy thu hồi ngay trên GitHub và tạo token mới. Token bị lộ vô hiệu hóa ngay khi bạn thu hồi nó.
- Cần chuỗi ngẫu nhiên mạnh cho các công cụ hoặc cấu hình khác? ToolCraft's Password Generator chạy hoàn toàn trên trình duyệt — không có dữ liệu nào được gửi ra ngoài.

