Hướng dẫn

Token GitHub và xác thực Git: personal access token, Git Credential Manager, push không cần mật khẩu

Cập nhật: · Skillaria.Top

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ỉ repositoryXác thực bằng
HTTPShttps://github.com/user/project.gitToken hoặc Git Credential Manager (đăng nhập qua trình duyệt)
SSHgit@github.com:user/project.gitCặ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

  1. Đăng nhập github.com, nhấn vào ảnh đại diện ở góc trên bên phải và mở Settings.
  2. Ở cuối menu bên trái, chọn Developer settings, rồi Personal access tokens.
  3. 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.
  4. Đặt tên dễ nhớ (ví dụ "laptop, công ty"), thời hạn, và quyền.
  5. 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ưuKhi nào dùng
managerGit Credential Manager: Windows Credential Manager, Keychain của macOS, Secret Service trên LinuxLựa chọn khuyến nghị cho máy làm việc
osxkeychainKeychain của macOSHelper mặc định của Git trên Mac
cacheTrong bộ nhớ, mặc định 15 phútMáy chủ Linux không muốn lưu token xuống đĩa
storeVăn bản thuần trong ~/.git-credentialsChỉ 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.

Học chủ đề này qua video

Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Git с нуля до уверенного разработчика”.

Đến khóa học