Hướng dẫn dùng git-credential-oauth: Đăng nhập GitHub và GitLab trên Terminal bằng trình duyệt

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Vì sao bạn nên bỏ Personal Access Token?

Từ tháng 8/2021, GitHub chính thức chặn mật khẩu tài khoản khi thao tác qua HTTPS. GitLab cũng áp dụng chính sách tương tự. Hai giải pháp thay thế phổ biến nhất là SSH key và Personal Access Token (PAT). SSH key rất tiện trên máy cá nhân cố định. Dù vậy, mạng Wi-Fi công ty hay mạng khách tại các tòa nhà văn phòng thường khóa cổng 22. Lúc này, HTTPS là đường thoát duy nhất.

Dùng HTTPS đồng nghĩa bạn phải làm bạn với Personal Access Token. Trải nghiệm này rất phiền. Mỗi khi đổi máy hoặc token hết hạn, bạn phải mở web, tích chọn từng scope quyền, rồi copy chuỗi ghp_... dài 40 ký tự dán vào Terminal. Khổ nhất là lúc cần đẩy hotfix gấp lên production lúc nửa đêm: lệnh git push báo lỗi 403 vì token vừa hết hạn 90 ngày. Nhiều bạn giải quyết tạm thời bằng cách lưu token vào file text hoặc cấu hình Git global. Rủi ro lộ mã nguồn lúc này cực kỳ cao.

Trước đây khi onboard 3 bạn fresher vào team, mình mất đứt nửa buổi sáng chỉ để hướng dẫn từng bạn tạo token, tick chọn đúng quyền repo và lưu vào máy. git-credential-oauth xử lý dứt điểm rắc rối này. Đây là helper mã nguồn mở viết bằng Go, dung lượng chỉ khoảng 6MB.

Công cụ đưa luồng xác thực OAuth 2.0 quen thuộc lên dòng lệnh. Bạn gõ lệnh Git, trình duyệt tự bật tab xác nhận. Bấm Authorize xong, token lập tức lưu vào keychain hệ điều hành. Bạn không cần tự tay copy-paste bất kỳ chuỗi token nào nữa.

Cài đặt

Nhờ viết bằng Go và đóng gói sẵn binary không phụ thuộc runtime bên ngoài, việc cài đặt diễn ra trong vài giây.

Trên Ubuntu / Debian

# Ubuntu 23.04+ hoặc Debian 12 (Bookworm)+:
sudo apt update
sudo apt install git-credential-oauth

# Phiên bản cũ hơn (tải binary trực tiếp từ GitHub Release):
curl -s https://api.github.com/repos/hickford/git-credential-oauth/releases/latest \
| grep "browser_download_url.*linux_amd64.tar.gz" \
| cut -d : -f 2,3 \
| tr -d \" \
| wget -qi -
tar -xzf git-credential-oauth_*_linux_amd64.tar.gz
sudo mv git-credential-oauth /usr/local/bin/
rm git-credential-oauth_*_linux_amd64.tar.gz

Trên macOS (Homebrew)

brew install git-credential-oauth

Trên Arch Linux / Fedora

# Arch Linux
sudo pacman -S git-credential-oauth

# Fedora
sudo dnf install git-credential-oauth

Kiểm tra phiên bản

Chạy lệnh kiểm tra binary đã nhận diện trong biến môi trường PATH:

git-credential-oauth --version

Cấu hình chi tiết

Điểm ăn tiền nhất của git-credential-oauth nằm ở lệnh tự cấu hình. Nó tự phát hiện các kho lưu trữ bảo mật sẵn có trên máy bạn như Secret Service trên Linux, Keychain trên macOS, hoặc Windows Credential Manager.

Bước 1: Tự động đăng ký helper vào Git

git-credential-oauth configure

Kiểm tra các directive vừa được ghi vào file ~/.gitconfig:

git config --global --get-all credential.helper

Đầu ra trên terminal thường hiển thị ba tầng helper hoạt động cùng nhau:

cache --timeout=7200
oauth -device
libsecret

Cơ chế phối hợp: Git kiểm tra tầng lưu an toàn (libsecret, osxkeychain hoặc manager) trước. Nếu chưa có token hoặc token đã hết hạn, tầng oauth mới mở trình duyệt để xin token mới rồi bàn giao lại cho tầng bảo mật cất giữ.

Bước 2: Dành cho GitLab Self-hosted hoặc Gitea nội bộ

Mặc định công cụ nhận diện sẵn GitHub, GitLab.com, Bitbucket và Codeberg. Nếu công ty bạn chạy máy chủ GitLab riêng trong mạng VPN, hãy trỏ domain và Client ID của OAuth App vào cấu hình Git:

# Cấu hình domain GitLab nội bộ
git config --global credential.https://gitlab.mycompany.internal.helper oauth
git config --global credential.https://gitlab.mycompany.internal.oauthClientID "1234567890abcdef"

Trải nghiệm thực tế & Quản trị phiên

Lần clone repo private đầu tiên

Thử clone một repository private qua HTTPS:

git clone https://github.com/my-org/core-service.git

Terminal sẽ in một dòng thông báo ngắn và tự động mở trình duyệt mặc định:

Opening in existing browser session.
Go to: https://github.com/login/oauth/authorize?client_id=...

Nhấp chuột vào nút Authorize hickford/git-credential-oauth màu xanh trên màn hình web. Quá trình xác thực hoàn tất sau 1 giây qua cổng callback localhost. Terminal tiếp tục kéo code về bình thường. Nhanh và gọn.

Làm việc trên VPS không có giao diện (Headless Server)

Bạn vẫn dùng được helper này khi SSH vào server qua cờ -device (mặc định đã bật trong lệnh configure). Đây là chuẩn OAuth Device Flow:

Please visit: https://github.com/login/device
And enter code: B8F2-4A1C

Mở trình duyệt trên máy tính cá nhân của bạn, truy cập link trên rồi nhập mã 8 ký tự. Máy chủ VPS ở xa sẽ nhận token ngay lập tức mà không cần cấu hình port forwarding hay X11.

Kiểm tra và hủy quyền (Revoke)

Quản lý các máy đang liên kết với tài khoản rất đơn giản:

  • Từ giao diện web GitHub: Vào Settings > Applications > Authorized OAuth Apps. Bạn sẽ thấy git-credential-oauth. Nếu vô tình làm mất laptop, bạn chỉ cần bấm nút Revoke để hủy quyền truy cập của máy đó ngay lập tức.
  • Xóa token trên máy cá nhân: Để xóa sạch credential đang lưu và đăng nhập lại từ đầu, chạy lệnh:
printf "protocol=https\nhost=github.com\n" | git credential-oauth erase

Thiết lập đúng 2 phút một lần duy nhất. Đổi lại, bạn và cả team thoát hẳn cảnh tạo token thủ công, vừa an toàn vừa tiết kiệm thời gian gỡ lỗi cấu hình mạng.

Share: