Token GitHub và xác thực Git: personal access token, Git Credential Manager, push không cần mật khẩu
Từ tháng 8 năm 2021, GitHub không còn chấp nhận mật khẩu tài khoản cho các thao tác Git qua HTTPS. Thay vào đó bạn dùng token GitHub (personal access token) hoặc đăng nhập qua Git Credential Manager, công cụ mở trình duyệt và tự lưu thông tin xác thực. Token được tạo tại Settings → Developer settings trên github.com, nhập thay cho mật khẩu khi git push hoặc git clone, và được credential.helper lưu lại.
Vì sao Git không còn nhận mật khẩu GitHub
Nếu khi git push bạn nhập tên đăng nhập và mật khẩu GitHub mà bị từ chối, nguyên nhân không phải gõ sai. Từ ngày 13 tháng 8 năm 2021, GitHub đã tắt đăng nhập bằng mật khẩu cho các thao tác Git qua HTTPS. Thay vào đó bạn dùng token GitHub (personal access token, PAT) hoặc xác thực qua trình duyệt do Git Credential Manager thực hiện.
Thông báo lỗi trông như sau:
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/... for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/user/project.git/'
Lý do rất đơn giản: mật khẩu tài khoản trao toàn quyền truy cập, không thể giới hạn cho một repository, và khó thu hồi. Token được tạo cho một mục đích cụ thể, có thời hạn và bộ quyền riêng, và nếu bị lộ, bạn có thể thu hồi trong một phút mà không cần đổi mật khẩu. GitLab và Bitbucket cũng đi theo hướng này, nên hầu hết nội dung bên dưới áp dụng được cho cả hai.
Hai cách xác thực: HTTPS và SSH
Git giao tiếp với repository remote qua một trong hai giao thức, và điều đó quyết định cách bạn đăng nhập.
| Giao thức | Địa chỉ repository | Xác thực bằng |
|---|---|---|
| HTTPS | https://github.com/user/project.git | Token hoặc Git Credential Manager (đăng nhập qua trình duyệt) |
| SSH | git@github.com:user/project.git | Cặp khóa SSH: khóa riêng trên máy bạn, khóa công khai trong cài đặt GitHub |
Khóa SSH chỉ cần thiết lập một lần, và sau đó Git không hỏi tên đăng nhập hay mật khẩu nữa. Cách tạo và thêm khóa vào GitHub đã được trình bày trong bài về cấu hình Git. Ở đây chúng ta tập trung vào HTTPS, vì đó là nơi người mới thường gặp yêu cầu mật khẩu nhất. Để xem repository của bạn dùng giao thức nào, chạy:
git remote -v
origin https://github.com/user/project.git (fetch)
origin https://github.com/user/project.git (push)
Cách tạo token GitHub (personal access token)
Personal access token là một chuỗi ngẫu nhiên dài mà GitHub cấp cho bạn thay cho mật khẩu khi truy cập bằng chương trình. Token classic bắt đầu bằng ghp_, còn fine-grained bắt đầu bằng github_pat_. Token chỉ hiển thị một lần ngay sau khi tạo, vì vậy hãy sao chép ngay vào trình quản lý mật khẩu.
Từng bước
- Đăng nhập github.com, nhấn vào ảnh đại diện ở góc trên bên phải và mở Settings.
- Ở cuối menu bên trái, chọn Developer settings, rồi Personal access tokens.
- Chọn loại: Fine-grained tokens (khuyến nghị) hoặc Tokens (classic), rồi nhấn nút tạo token mới.
- Đặt tên dễ nhớ (ví dụ "laptop, công ty"), thời hạn, và quyền.
- Nhấn nút generate, rồi sao chép token ngay.
Fine-grained hay classic
Token fine-grained được giới hạn ở những repository cụ thể và các quyền riêng lẻ. Với công việc code thông thường, hãy chọn repository cần thiết và cấp quyền Contents: Read and write cho repository đó. Quyền này đủ cho clone, pull và push. Nếu bạn chỉ đọc một repository riêng tư, chỉ cần Read-only.
Token classic có hiệu lực trên toàn bộ repository của bạn. Để push vào repository cần phạm vi repo, còn để sửa file trong .github/workflows thì cần thêm workflow. Classic đơn giản hơn nhưng nguy hiểm hơn: nếu bị lộ, toàn bộ tài khoản bị mở.
Thời hạn
GitHub đưa ra vài lựa chọn thời hạn và cho phép chọn ngày tùy ý. Có thể tạo token không thời hạn, nhưng không nên: token vĩnh viễn bị quên là lỗ hổng bảo mật kinh điển. Nên đặt 30–90 ngày và tạo lại khi được nhắc. GitHub sẽ gửi e-mail nhắc trước khi token hết hạn.
Git push và git clone bằng token
Dùng token dễ hơn bạn tưởng: Git hỏi "Password", bạn dán token vào đó thay vì mật khẩu.
$ git push origin main
Username for 'https://github.com': your-login
Password for 'https://your-login@github.com': <dán token>
Trong terminal, các ký tự mật khẩu không hiển thị. Điều đó là bình thường: cứ dán token rồi nhấn Enter. Trên Git Bash của Windows, dán bằng Shift+Insert hoặc chuột phải.
Git clone with token
Repository riêng tư được clone theo cách tương tự: git clone sẽ hỏi tên đăng nhập và token. Nếu bạn muốn không bị hỏi (ví dụ trong script), có thể đặt token trực tiếp vào địa chỉ:
git clone https://your-login:<TOKEN>@github.com/user/project.git
Nhược điểm: địa chỉ chứa token sẽ được lưu vào .git/config và có thể đi vào lịch sử shell. Sau khi clone, nên xóa token khỏi địa chỉ:
git remote set-url origin https://github.com/user/project.git
Trong các hệ thống CI, token được truyền qua biến môi trường bí mật, không ghi vào file. GitHub Actions đã có sẵn GITHUB_TOKEN cho repository hiện tại, nên thường không cần PAT riêng.
GitLab: git clone bằng token
Trên GitLab, token được tạo trong cài đặt hồ sơ, mục Access tokens. Với công việc code cần các phạm vi read_repository và write_repository. Cách dùng giống nhau: tên đăng nhập GitLab làm username, token làm mật khẩu.
git clone https://oauth2:<TOKEN>@gitlab.com/group/project.git
GitLab chấp nhận tên oauth2 cho mọi token cá nhân. Thay vào đó bạn cũng có thể ghi tên đăng nhập của mình.
Git pull và fetch
Với repository công khai, git pull và git clone hoạt động không cần xác thực. Chỉ khi repository riêng tư hoặc khi git push thì mới bị hỏi đăng nhập và token. Nếu pull trên dự án công khai bỗng hỏi mật khẩu, thường là địa chỉ bị gõ sai: GitHub trả lời một repository không tồn tại giống như với repository bị đóng.
Git Credential Manager là gì
Nhập token mỗi lần push thật phiền. Việc này được giao cho credential helper, một chương trình phụ mà Git gọi khi cần thông tin xác thực. Git đưa cho nó địa chỉ máy chủ, và nó trả về tên đăng nhập và mật khẩu (hoặc token) từ kho lưu trữ của mình.
Git Credential Manager (GCM) là helper tiện lợi nhất. Đây là chương trình đa nền tảng của GitHub và Microsoft: khi push lần đầu, GCM mở cửa sổ đăng nhập hoặc trình duyệt, bạn đăng nhập GitHub (kể cả với xác thực hai yếu tố), và GCM tự lấy token rồi cất vào kho bảo mật của hệ thống. Bạn không cần tự tạo PAT.
GCM hỗ trợ GitHub, GitLab, Bitbucket và Azure DevOps. Trên Git cho Windows, GCM được cài mặc định; đó chính là lựa chọn credential helper trong trình cài đặt.
Các loại credential.helper
| Giá trị | Nơi lưu | Khi nào dùng |
|---|---|---|
manager | Git Credential Manager: Windows Credential Manager, Keychain của macOS, Secret Service trên Linux | Lựa chọn khuyến nghị cho máy làm việc |
osxkeychain | Keychain của macOS | Helper mặc định của Git trên Mac |
cache | Trong bộ nhớ, mặc định 15 phút | Máy chủ Linux không muốn lưu token xuống đĩa |
store | Văn bản thuần trong ~/.git-credentials | Chỉ dùng trên máy bị cô lập; ai có quyền đọc file đều xem được token |
Thiết lập xác thực Git trên Windows, macOS và Linux
Xem helper nào đang được bật:
git config --show-origin --get-all credential.helper
Windows
Nếu khi cài Git bạn giữ nguyên thiết lập mặc định, GCM đã hoạt động: lần push đầu tiên trong Git Bash, PowerShell hoặc VS Code sẽ mở cửa sổ đăng nhập GitHub. Nếu helper chưa được bật, hãy kích hoạt thủ công:
git config --global credential.helper manager
macOS
Git trên Mac thường đã dùng osxkeychain: token nhập một lần sẽ được lưu vào Keychain. Để đăng nhập qua trình duyệt, cài Git Credential Manager (ví dụ bằng Homebrew: brew install --cask git-credential-manager), công cụ này sẽ tự đăng ký vào cấu hình.
Linux
Trên Linux, GCM được cài riêng (gói .deb hoặc file nén từ trang release của dự án), sau đó cấu hình và chọn nơi lưu:
git-credential-manager configure
git config --global credential.credentialStore secretservice
Trên máy chủ không có giao diện đồ họa, cache tạm thời tiện hơn:
git config --global credential.helper 'cache --timeout=3600'
Cách thay thế cho GitHub: gh auth login
Nếu đã cài GitHub CLI, lệnh gh auth login sẽ hướng dẫn đăng nhập qua trình duyệt, còn gh auth setup-git cấu hình Git để lấy thông tin xác thực từ gh. Đây là cách tiện để "đăng nhập trong Git Bash" chỉ với một lệnh.
Cách xóa hoặc cập nhật mật khẩu Git đã lưu
Tình huống phổ biến nhất: token đã hết hạn hoặc bạn đổi tài khoản, nhưng Git vẫn dùng dữ liệu cũ và nhận Authentication failed. Cần xóa mục đã lưu, khi đó lần push tiếp theo Git sẽ hỏi lại.
Lệnh chung
Dùng được với mọi helper:
printf "protocol=https\nhost=github.com\n\n" | git credential reject
Git reset credentials trên Windows
Mở "Control Panel" → "Credential Manager" → "Windows Credentials", tìm các mục có dạng git:https://github.com và xóa. Có thể làm tương tự trên command prompt:
cmdkey /list | findstr git
cmdkey /delete:git:https://github.com
Nếu dùng GCM, cũng có lệnh riêng để đăng xuất tài khoản: git credential-manager github logout <tên-đăng-nhập>.
macOS
Mở "Keychain Access", tìm mục github.com loại "Internet password", rồi xóa. Hoặc từ terminal:
git credential-osxkeychain erase
host=github.com
protocol=https
Sau dòng cuối, nhấn Enter thêm một lần để gửi dòng trống.
Linux và store
Với store, xóa dòng github.com trong ~/.git-credentials. Với cache, chạy git credential-cache exit.
Lỗi xác thực và cách khắc phục
Support for password authentication was removed
Bạn đã nhập mật khẩu tài khoản. Hãy tạo token và dán vào ô Password, hoặc cấu hình Git Credential Manager. Nếu lỗi lặp lại mà không hỏi mật khẩu, nghĩa là mật khẩu cũ vẫn còn trong kho lưu trữ. Hãy xóa theo hướng dẫn ở trên.
git push: Authentication failed
Nguyên nhân theo thứ tự thường gặp: token đã hết hạn; token bị thu hồi; token fine-grained không có quyền vào repository này, hoặc quyền Contents chỉ đọc; kho lưu trữ chứa thông tin của tài khoản khác. Kiểm tra thời hạn và quyền của token trong Developer settings, rồi xóa thông tin đăng nhập đã lưu.
remote: Permission denied (403)
Xác thực thành công, nhưng tài khoản của bạn không có quyền ghi vào repository này. Chủ repository cần thêm bạn vào Collaborators, hoặc bạn làm việc qua fork và pull request.
Repository not found
Với repository riêng tư, GitHub không tiết lộ việc nó có tồn tại hay không, nên khi token sai nó báo "not found". Kiểm tra địa chỉ bằng git remote -v và quyền của token.
Git clone hỏi mật khẩu mỗi lần
Chưa cấu hình credential helper. Bật manager hoặc osxkeychain; sau lần nhập thành công đầu tiên, Git sẽ không hỏi nữa. Cách khác là chuyển sang SSH.
Cách lưu token an toàn
- Cấp quyền tối thiểu: token fine-grained cho các repository cần thiết, thay vì classic với
repo. - Đặt thời hạn và tạo lại token, đừng gia hạn vô thời hạn.
- Không commit token và không đặt token vào địa chỉ remote. Nếu token lọt vào repository công khai, GitHub có thể tự thu hồi, nhưng hãy coi như nó đã bị lộ và tự xóa.
- Dùng kho lưu trữ của hệ thống (GCM, Keychain) thay vì
store. - Một token cho một máy hoặc một công việc, để khi bị lộ bạn chỉ cần thu hồi đúng token đó.
Kết luận
Mật khẩu GitHub không còn dùng được cho Git qua HTTPS từ năm 2021. Có ba cách làm việc: đăng nhập qua Git Credential Manager trong trình duyệt, tạo token GitHub và nhập thay mật khẩu, hoặc chuyển sang khóa SSH. Token được tạo tại Settings → Developer settings và được credential.helper lưu lại. Khi gặp Authentication failed, thường chỉ cần tạo lại token và xóa thông tin cũ là đủ. Kết nối với GitHub và làm việc với repository remote được trình bày thực hành trong khóa học Git.
Câu hỏi thường gặp
Tôi có thể xem lại token GitHub sau khi đã tạo không?
Không, GitHub chỉ hiển thị token một lần. Nếu chưa kịp lưu, hãy xóa token cũ và tạo token mới.
Có cần token để git clone một repository công khai không?
Không. Repository công khai có thể clone và cập nhật bằng git pull mà không cần xác thực. Token chỉ cần cho repository riêng tư và khi git push.
Điều gì xảy ra khi token hết hạn?
Git sẽ bắt đầu báo Authentication failed. Hãy tạo token mới (hoặc bấm Regenerate với token cũ), xóa thông tin đăng nhập đã lưu, rồi nhập token mới ở lần push tiếp theo.
Token GitHub có hoạt động khi bật xác thực hai yếu tố không?
Có, thực tế token cần thiết khi bật 2FA, vì nó thay thế mật khẩu và mã xác nhận cho các thao tác Git. Git Credential Manager cũng tự xử lý 2FA khi đăng nhập qua trình duyệt.
Git lưu tên đăng nhập và mật khẩu ở đâu?
Bản thân Git không lưu chúng. Việc này do credential helper đảm nhận: Windows Credential Manager, Keychain của macOS, Secret Service trên Linux, hoặc file ~/.git-credentials nếu dùng helper store.
Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Git с нуля до уверенного разработчика”.
- Установка и настройка: готовим Git к первому запуску
- GitHub и удалённые репозитории: ваш код в облаке