gitで2要素認証を突破するためのGit Credential Managerの紹介

# はじめに

GitHubで2要素認証を設定した上で `git` で `push` などをするためには,
アクセストークンを払い出すか, SSHの公開鍵を登録するかが必要です.
しかし, 自分が手動で登録・管理しなければならない認証情報が増えて面倒ですし,
せっかく2要素認証を設定したのにセキュリティが微妙になる感じがします.

そこで, Microsoftが開発している **Git Credential Manager (GCM)** を使うと,
手動での認証情報の登録不要 (OAuth) で, 2要素認証に対応できます.
[GitHub](https://github.com) のほか, [GitLab](https://gitlab.com) や [Bitbucket](https://bitbucket.org), [Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops) にも対応しています.


https://github.com/git-ecosystem/git-credential-manager

GCMは[Git for Windows](https://git-for-windows.github.io/)ではデフォルトで使えますが,
MacやLinuxではhomebrewでインストールします.

# インストールしてみる

まず認証管理の初期設定を下記のように確認してみます.
(自分のMacでは, キーチェーンを使う設定となっていました.)

```console:出力例
$ git config --show-origin credential.helper
file:/opt/homebrew/etc/gitconfig	osxkeychain
```

ここで, homebrewで下記のようにインストールします.

```console
$ brew install git-credential-manager
```

インストール完了後に再度確認すると, 下記のように`credential-manager`を使用するようになっています.
(`~/.gitconfig` には, 設定が自動で追加されます. )

```console:出力例
$ git config --show-origin credential.helper
file:/Users/skkzsh/.gitconfig   /usr/local/share/gcm-core/git-credential-manager

$ git credential-manager --version
2.5.0+d34930736e131ad80e5690e5634ced1808aff3e2

$ tail ~/.gitconfig

[credential]
    helper =
    helper = /usr/local/share/gcm-core/git-credential-manager
[credential "https://dev.azure.com"]
    useHttpPath = true
```

# git pushのときに, GitHubの2要素認証を突破してみる

この設定で, https接続で `git push` してみます.

```console:出力例
$ git remote -v
origin  https://github.com/skkzsh/gcm-test.git (fetch)
origin  https://github.com/skkzsh/gcm-test.git (push)

$ git push origin
info: please complete authentication in your browser...
```

すると,

> info: please complete authentication in your browser...

が出た上で, 以下のようなGitHubのポップアップ画面が出ます.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/918f751b-cf26-6669-19ef-2fd5f9b9dd0e.png" width="520px" alt=sign-in>
「**Sign in with you browser**」をクリックすると, ブラウザにリダイレクトされます.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/4ced91de-ee69-2b5f-17f2-f43222b06c55.png" width="520px" alt=authz>
「**Authorize GitCredentialManager**」をクリックすると, 以下の成功画面が出ます.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/c925353d-b448-60d1-e99c-4509c32e1fa8.png" width="520px" alt=authn>
`git push` の画面に戻ってみると, 成功しているハズです.

なお, [「**Settings**」 -> 「**Applications**」 -> 「**Authorized OAuth Apps**」](https://github.com/settings/applications) を見ると,
「**Git Credential Manager**」が追加されているのが確認できます.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6361/1c877256-c90f-4816-9aaa-bb85214a2ca5.png" width="720px" alt=app>
以後 `git` を使うときは, 再び認証 (認可) を求められることはありません.
(Macだと, キーチェーンに認証情報が保存されています. )

GitHubに登録してあるアクセストークンやSSHの公開鍵は削除して大丈夫です.

# 参考

https://github.blog/2022-04-07-git-credential-manager-authentication-for-everyone/

https://git-scm.com/docs/gitcredentials

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98

# 確認環境
- macOS Sonoma (14.4.1)
- CPU: M3
- Git 2.45.0
- Git Credential Manager 2.5.0