数のGitHubアカウントをSSHで認証したいとき (Mac・Linux向け)

コマンドラインからの　github に対して認証するとき、 SSH は一番良い方法で、主流である。
 ➡ git + GitHub を使っている以上、[このて手順で](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)自分の端末の GitHub 用 SSH 認証を設定しているでしょう。

GitHub の手順は1つの GitHub アカウントのために十分分かりやすいが、複数の GitHub アカウントを連携して作業したい場合はどうすればいい？

以下、回答してみる！


## どんな場合に複数アカウントを使いたくなる？
以下のシナリオで私は複数アカウントを同じ端末で使いたくなったことがある。
- 仕事の端末で、個人 GitHub アカウントでオープンソースに貢献したい
- 請負案件で、社内の GitHub で作業しているが、納品するには顧客の repository に顧客が指定したアカウントで PR を作らないといけない

なお、手順だけを知りたければ、[複数アカウントをSSHで認証する方法](https://qiita.com/drafts#%E8%A4%87%E6%95%B0%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92ssh%E3%81%A7%E8%AA%8D%E8%A8%BC%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)にジャンプして良い。

ただ、認証だから慎重に(内容を完全に理解した上に手順を実施する)やりたければ、
以下で説明している「重要なコンセプト」を先に読む方が良いでしょう。

## 重要なコンセプト

### まず、git != GitHub
書くまでもないことだと言えるかもしれないが、意外と混在しやすいと思う※。

- git では、ログインしたりする「アカウント」の概念がない
  -  global もしくは local のコンフィグに設定している `name` と `user` だけがある
  -  `git commit` する時、その情報が commit(そして log) に含まれる
- ある GitHub アカウントで端末の[設定手順](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)すると、あくまで GitHub に対する認証を行っている

※ 例えば、 新しいプロジェクトに参画する時、GitHub、git アカウントの設定を行うが、そのタイミング以外、git/GitHub アカウントのあたりをあまり意識しなくても、業務ができる。その結果、git/GitHub の関係、設定の理解力が怠ってしまいえる。。。というケースは少なくないと思う！


### SSH の概要はなんでしたっけ？
2つコンピューターが安全にやり取りするための protocol である。
SSH により、 client 側が server 側に対して認証し、接続できる。
- client で private key, public key を生成する
- client （接続元)で、private key を保持する
- server (接続先）に　public key を置く

### SSH で接続するとの INPUT とは？
接続するには、client で以下のものを指定する
1. **host**: server の address. github の場合は、(アカウント問わず!) 「**github.com**」
2.  public/private **key の pair**: アカウントを区別できるように、アカウント毎に public/private の key pairを生成し、アカウントに登録する

例えば、２つの github アカウント、 github.com/abc、 github.com/def があれば、
自分の端末それぞれのための SSH key pair を生成し、該当のアカウントに public key を登録する

生成した key pairs:
|認証したいアカウント | private key filename | public key filename|
| -- | --| --|
|abc| id_ed22519_abc | id_ed22519_abc.pub|
|def| id_ed22519_def|id_ed22519_def.pub|

### git→Github に接続する時、INPUT (1) host の決まり方
git の command を使うと、`git@github.com-abc:jonathan-h-grebe/notes.git` のような URL を指定することになる。※
そこで、例えば URL が `git@github.com-abc:jonathan-h-grebe/notes.git` の場合には、host が `github.com-abc` と思えるかもしれないが、**そうと限らない!!** 実は、その `github.com-abc` はあくまで **ALIAS** である。

※ `git clone` のように url を直接書く場合もあれば、`git pull` などで予めに設定されている upstream url を使う場合もあるが、いずれにしても url を指定しているよね

#### ポイント：ALIAS が config ファイルと比較され、 マッチしたエントリの host が適用される。

### git→Github に接続する時、INPUT (2) key の pair の決まり方

以下の画像を示しているように、 ~/.ssh/config に、ALIAS が Host と一致するエントリがあれば、
- エントリの Hostname が実際の接続で採用される 
- **エントリの IdentityFile**　（GitHub アカウントで 該当の private key が登録されるため、これでアカウント紐付けができる ） で定義されている **private key** が認証で採用される

![スクリーンショット 2024-08-12 20.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1680534/ef0e094c-ba97-9875-17dc-df2ad9edd786.png)



## 複数アカウントをSSHで認証する方法

1. アカウント毎に、public/private key pair を生成する (GitHub 手順の「[Generating a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent)」① )
→ それぞれのアカウントに、該当の public キーを登録する（「[Adding a new SSH key to your account](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account#adding-a-new-ssh-key-to-your-account)」）
2. 生成した key を ~/.ssh/config に登録する時(「[Generating a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent)」の②)、Host を、`github.com` そのアカウントを識別するための alias に変更する。また、`IdentityFile` をアカウントと該当する public key へのパスにする ※ALIAS の値任意なのでなんでもいい 
3. それぞれのアカウントを適用したい repository のコンフィグを、該当の ALIAS が適用されるように調整する
    1. `git clone` する時、GitHub からコピペする SSH URL の host を、ALIAS に変更
    2. git config にて、`[remote "origin"]`の `url` の host を ALIAS に変更する


<br><br>
以上！