Git の認証
CI サーバ経由で https リモートURL指定の Git リポジトリに push できなくてはまったりした。
ここではコマンドラインでの認証に限定して記載します。
コマンドラインで認証する場合
HTTPS
認証が必要なタイミングで入力を求められる
毎回の入力を避けたければ、認証ヘルパー を利用する必要がある
認証情報ヘルパーでキャッシュすることができる
パスワードベースの認証は 非推奨
PAT (個人アクセストークン) をパスワードの代わりに入力するのが推奨されている
認証ヘルパー
GitHub リポジトリを HTTPS で clone した場合、credentials のキャッシュとして推奨されているのは以下。利用方法は GitHub の Doc を参照。
GitHub CLI
Git Credential Manager Core (GCM Core)
git-credential-osxkeychain を利用して、パスワードやPATを Keychain に保存/管理する方法もあるようだった。が、こちらよりは、SSH を使うか GCM Core の利用が現時点では推奨されていた。
a
credential.helper
認証ヘルパーとは
Git の認証情報をキャッシュしてくれるヘルパーのこと。認証ヘルパー自体は Git からは独立しているため、独自のカスタムな認証ヘルパーを実装して利用することも可能となっている。
ヘルパーの種類
Git において、HTTPS の場合に認証情報をキャッシュする仕組みにはデフォルトでは 5 種類ほど存在する。永続化される場合はいずれも有効期限はない。
デフォルト だと、何もキャッシュされない
cache モードだと、15 分間メモリにキャッシュされる
store モードだと、テキストファイルで永続化される
osxkeychain モードだと、Keychain に永続化される (macOS のみ)
wincred モードだと、Windows Credential Store に永続化される (Windows のみ)
ヘルパーの有効化
このモードの切り替えには、git config コマンドを利用する。
code:shell
$ git config --global credential.helper cache
# タイムアウトを指定できる
$ git config --global credential.helper cache --timeout 1500
# キャッシュ場所を指定できる (デフォルトだと ~/.git-credentials)
$ git config --global credential.helper store --file path/to/cache-file
.gitconfig に設定を記載しておくこともできる。記載しておくと、上から順に優先して利用される。ただし、認証情報を保存する場合は全てのヘルパーに保存される。
code:.gitconfig
helper = store --file /mnt/thumbdrive/.git-credentials
helper = cache --timeout 30000
この credential.helper に設定された設定値は、後続で説明する git credential コマンドの呼び出し方に密接に関連する。ここでの設定値によって、呼び出される git credential コマンドが変化することになる。
code:sh
# helper = foo だった場合、git credential-foo が実行される
$ git credential-foo
# helper = foo -a --opt=bcd だった場合、git credential-foo -a --opt=bcd が実行される
$ git credential-foo -a --opt=bcd
# /absolute/path/foo -xyz だった場合、/absolute/path/foo -xyz が実行される
$ /absolute/path/foo -xyz
# !f() { echo "password=s3cre7"; }; f だった場合、! 以降のコードが実行される
$ f() { echo "password=s3cre7"; }; f
有効なヘルパーの確認
Git で現在有効となっている設定の確認には git config を利用する。--show-origin で設定項目が定義されたファイルと、有効な設定値を確認できる。
code:shell
$ git config --show-origin --list
特に、認証ヘルパー (credential.helper) の設定値についてのみ確認したいなら下記のようにする。
code:shell
$ git config --show-origin --get credential.helper
ヘルパーの操作
認証ヘルパーの想定されるI/Fには、以下の 3 種類があり、Git によって利用される。
get は、認証情報の出力に利用されることを想定している
store は、認証情報の保存に利用されることを想定している
erase は、認証情報の削除に利用されることを想定している
git credential
認証ヘルパーの操作には git credential コマンドを利用するのが基本になっている。git credential はシステムが利用できる 全ての 認証ヘルパーに影響を及ぼすようだ。
git credential fill は、
git credential approve は、
SSH
SSH 公開鍵を GitHub アカウントに登録しておけば良い。SSH の仕組みに乗っかるのでその点では単純。
Tips
Keychain の security コマンドで Keychain の内容を確認できて便利。
参考