git-credential-oauth導入ガイド:ターミナルからブラウザ経由でGitHub・GitLabにログインする

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

なぜパーソナルアクセストークンをやめるべきなのか?

2021年8月以降、GitHubはHTTPS経由でのパスワード認証を廃止しました。GitLabも同様のセキュリティポリシーを導入しています。これに伴う代替策として代表的なのがSSHキーとパーソナルアクセストークン(PAT)です。固定の開発マシンであればSSHキーは非常に快適ですが、企業のWi-Fiやオフィスのゲストネットワークではポート22がブロックされているケースが少なくありません。そのような環境では、HTTPSが唯一の通信手段となります。

しかしHTTPSを利用する場合、常にパーソナルアクセストークンと付き合わなければなりません。これが開発体験を著しく損ねています。マシンのセットアップ時やトークンの有効期限が切れるたびに、ブラウザで管理画面を開き、必要なスコープにチェックを入れ、40文字ものghp_...文字列をコピーしてターミナルに貼り付ける必要があります。深夜に本番環境への緊急ホットフィックスを反映しようとした際、90日のトークン期限切れでgit pushが403エラーを返す時のストレスは計り知れません。一時しのぎとしてトークンをテキストファイルやGitのグローバル設定に平文保存してしまう開発者も多く、ソースコード流出のリスクを大幅に高めています。

以前、チームに新卒メンバーを3名迎えた際も、それぞれのPCでトークンを発行させ、適切なrepo権限を設定して保存させるだけで午前中が丸ごと潰れてしまったことがありました。こうした煩わしさを根本から解決してくれるのがgit-credential-oauthです。これはGo言語で書かれたオープンソースのクレデンシャルヘルパーで、バイナリサイズもわずか6MB程度に抑えられています。

このツールを導入すると、普段Webサービスで利用しているOAuth 2.0の認証フローがそのままコマンドラインで動作します。Gitコマンドを実行すると自動的にブラウザで認証タブが開き、Authorizeをクリックするだけで、取得したトークンがOSのセキュアなキーチェーンへ即座に保存されます。もう長いトークン文字列を手動でコピー&ペーストする必要はありません。

インストール

Goでビルドされた単一のバイナリとして配布されており、外部ランタイムに依存しないため、数秒でインストールが完了します。

Ubuntu / Debian

# Ubuntu 23.04以降 または Debian 12 (Bookworm)以降:
sudo apt update
sudo apt install git-credential-oauth

# それ以前のバージョン(GitHub Releasesからバイナリを直接ダウンロード):
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

macOS (Homebrew)

brew install git-credential-oauth

Arch Linux / Fedora

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

# Fedora
sudo dnf install git-credential-oauth

バージョンの確認

環境変数PATHに正しく認識されているかコマンドを実行して確認します:

git-credential-oauth --version

詳細な設定手順

git-credential-oauth最大の魅力は、自動設定コマンドが用意されている点です。LinuxのSecret Service、macOSのKeychain、WindowsのCredential Managerなど、OSに組み込まれたセキュアストレージを自動で検出して連携してくれます。

ステップ1:Gitへヘルパーを自動登録

git-credential-oauth configure

~/.gitconfigファイルに書き込まれたディレクティブを確認します:

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

ターミナルには、以下のように3層のヘルパーが連携して動作するよう出力されます:

cache --timeout=7200
oauth -device
libsecret

連携の仕組み: Gitはまずセキュアストレージ層(libsecret、osxkeychain、またはmanager)をチェックします。トークンが存在しない場合や期限切れの場合にのみoauth層が呼び出され、ブラウザを開いて新規トークンを発行し、それをセキュアストレージ層へと引き渡して安全に保管します。

ステップ2:セルフホスト型GitLabや社内Giteaでの設定

デフォルトでGitHub、GitLab.com、Bitbucket、Codebergに対応しています。社内VPN配下のプライベートなGitLabサーバーを利用している場合は、Git設定に対象ドメインとOAuth AppのClient IDを登録します:

# 社内GitLabドメインの設定
git config --global credential.https://gitlab.mycompany.internal.helper oauth
git config --global credential.https://gitlab.mycompany.internal.oauthClientID "1234567890abcdef"

実際の使用感とセッション管理

プライベートリポジトリを初めてクローンする場合

HTTPS経由でプライベートリポジトリをクローンしてみます:

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

ターミナルに案内メッセージが表示され、既定のブラウザが自動的に起動します:

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

ブラウザ上に表示される緑色のAuthorize hickford/git-credential-oauthボタンをクリックします。localhostのコールバック経由でわずか1秒ほどで認証が完了し、ターミナル側でそのままコードの取得が続行されます。極めてシンプルで高速です。

GUIのない環境(ヘッドレスサーバー / VPS)での利用

SSH接続先のサーバーでも、-deviceフラグ(configureコマンド実行時に標準で有効化)を利用することで本ツールを問題なく使用できます。これはOAuth Device Flowと呼ばれる標準仕様に基づいています:

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

手元のローカルPCのブラウザで表示されたURLを開き、8文字のコードを入力するだけです。ポートフォワーディングやX11転送を設定することなく、リモートのVPS側に即座にトークンが渡されます。

連携の確認と権限の取り消し(Revoke)

アカウントに紐づく端末の管理も非常に容易です:

  • GitHubのWeb管理画面から:Settings > Applications > Authorized OAuth Appsを開くと、git-credential-oauthが一覧に表示されます。万が一ノートPCを紛失した場合でも、Revokeをクリックするだけで該当端末からのアクセス権限を一括で無効化できます。
  • ローカルマシンからトークンを削除:保存されている認証情報を完全に破棄し、初回状態から再ログインしたい場合は、以下のコマンドを実行します:
printf "protocol=https\nhost=github.com\n" | git credential-oauth erase

たった1回、わずか2分ほどの初期設定を済ませるだけで、トークンの手動作成という不毛な作業からチーム全員が解放されます。セキュリティを高めつつ、ネットワーク周りのトラブルシューティングにかかる無駄な時間も大幅に削減可能です。

Share: