Gitにおけるパスワード入力を省略する(Windows編)


はじめに📌

GitHub はHTTPプロトコルにおけるパスワード認証を廃止して個人アクセストークン認証への切り替えを推奨している(参考)。
今までは主にSSH認証を使っていたけど、この際だから推奨されている 個人アクセストークン認証 over HTTPS に切り替えることにした。

とはいえ git 操作のたびにユーザ名や個人アクセストークンを入力するのは面倒なので、自動的に認証するよう設定を行う。

Table 1. 環境
App Version

Windows10

git

2.27.0.windows.1

PowerShell

7.0.3

やったこと

flow

個人アクセストークンを作成した後、次のコマンドを叩いたら設定終わり。

Git認証・Windows資格情報の設定
git config --global credential.helper wincred

$cred = Get-Credential -Credential YOUR_GITHUB_USERNAME
cmdkey /generic:git:https://github.com `
  /user:$($cred.UserName) `
  /pass:$($cred.GetNetworkCredential().Password)

Remove-Variable cred

個人アクセストークンの利用方法🔑

使うときは単純にパスワードとして個人アクセストークンの値を入力すればいいみたい。

個人アクセストークンの作成方法については公式リファレンスを参考。
スコープはとりあえず repo にチェックしておけばよいかと。

Git の credential helper 🔐

GitではHTTPプロトコルを利用する場合の認証情報を保存するための仕組みが有り、credential.helper オプションで設定する。

今回はWindows環境なので wincred を使い、Windowsの資格情報マネージャーで認証を管理する。

gitの認証ツールとしてwincredを利用する
git config --global credential.helper wincred
定番の認証ツール
Windows

Windows資格情報を利用する wincred

MacOS

osxkeychain

Linux

調べてみたところではみんなまちまちっぽい。
cache でメモリに短時間保存する、または Git Credential Manager Core を使ってGPG暗号化して管理するのが主流?

credential.helperがうまく設定されない場合

自分の場合は ~/.gitcofig ファイルに [credential "helperselector"] が設定されていたので、これを削除して改めて wincred を設定した。

git config --global --unset credential.helperselector.selected
git config --global credential.helper wincred

Windows資格情報マネージャーへの登録🗃️

credential.helperselector を上記で設定していれば、最初の git 操作時に認証情報の入力を求められて自動的に保存される。

以下はその最初の入力をコマンドやGUIから能動的にやる方法。
なので必須作業ではないです。

PowerShell から登録する

cmdkey コマンドを使えば PowerShell から登録できる。
今回は GitHub の認証情報を登録していく。

一応セキュリティを考慮して、個人アクセストークンを平文で扱うことは避け、Get-Credential コマンドレットにより暗号化してから扱うことにした。

Example 1. GitHubのユーザ名と個人アクセストークンを資格情報に登録する
(1)
$cred = Get-Credential -Credential YOUR_GITHUB_USERNAME

PowerShell credential request
Enter your credentials.
Password for user YOUR_GITHUB_USERNAME: *****  (2)

(3)
cmdkey /generic:git:https://github.com `
  /user:$($cred.UserName) `
  /pass:$($cred.GetNetworkCredential().Password)

(4)
Remove-Variable cred
1 GitHub の認証情報を変数 $cred に保存する。
YOUR_GITHUB_USERNAME はそれぞれ自分の GitHub ユーザ名に修正する。
2 ここで個人アクセストークンを入力する。これは暗号化される。
3 cmdkey コマンドで汎用資格情報に登録する。
今回は GitHub を対象にするので、ターゲットを git:https://github.com とする。
4 必要なくなった変数 $cred を削除。
変数展開の仕方について
cmdkey はうまく PowerShell 変数オブジェクトをあつかえない。
よって変数 $cred がコマンドに渡される前に変数展開させておく必要がある。
このため変数展開には部分式( $($…​) )を使うことで先行評価させている(参考: PowerShell のString評価の方法と罠)。

Get-Credential コマンドレットを実行したとき、環境によってはCLIの代わりに次のようなダイアログが出る。
このときもパスワード欄に個人アクセストークンを入力すればいい。
資格情報入力ダイアログ


以上で git 利用時の GitHub 認証情報が登録された。
これによりプライベートリポジトリをクローンするときなどで、毎回ユーザ名・パスワードを入力する手間が省ける。

登録した資格情報の確認

資格情報マネージャーに登録された Git の認証情報を確認したい場合は cmdkey /list:<TARGET_NAME> コマンドで一覧表示できる。

Example 2. 登録されているgit資格情報の一覧確認
cmdkey /list:git:http*

    ターゲット: git:https://github.com
    種類: 汎用
    ユーザー: YOUR_GITHUB_USERNAME
    ローカル コンピューターの常設

資格情報の削除

間違えた資格情報を登録してしまったときなど、削除するには cmdkey /delete:<TARGET_NAME> コマンドを使う。

Example 3. GutHubの資格情報を削除
cmdkey /delete:git:https://github.com

CMDKEY: 資格情報を正しく削除しました。

GUIで登録する場合

  1. コントロールパネルユーザーアカウント資格情報マネージャーWindows資格情報 を開く

  2. 汎用資格情報の追加 からGit認証情報を追加

  3. 今回はGitHub接続時の認証情報を追加

    • インターネットまたはドメインのアドレス には git:https://github.com を指定。

    • ユーザー名 はGitHubに登録しているユーザ名またはメールアドレス。

    • パスワード に個人アクセストークンを入力する。

おわりに😎

今回は git コマンドによる GitHub への認証をWindows資格情報マネージャーで管理することで、自動的に認証されるようにした。
これでもうHTTPSプロトコルでの認証もこわくない。

記事の主体が資格情報マネージャーのコマンド操作になった気がするけど、まあええやろの精神😗。