# GitHubトークンとGitの認証: personal access token、Git Credential Manager、パスワードなしのpush

URL: https://skillaria.top/ja/guides/git/github-token-git-auth

2021年8月以降、GitHubはHTTPS経由のGit操作でアカウントのパスワードを受け付けなくなりました。代わりに、GitHubのトークン（personal access token）か、ブラウザーでログインするGit Credential Managerを使います。トークンはGitHubの Settings → Developer settings で作成し、git pushやgit cloneのパスワード欄に入力します。保存はcredential.helperが担当します。

## GitHubのパスワードがGitで使えない理由

`git push` でGitHubのログイン名とパスワードを入力して拒否される場合、入力ミスではありません。2021年8月13日以降、GitHubはHTTPS経由のGit操作でパスワードによる認証を無効にしました。代わりに、GitHubのトークン（personal access token、PAT）を使うか、Git Credential Managerがブラウザーで行う認証を使う必要があります。

エラーメッセージは次のような内容です。

```
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/... for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/user/project.git/'
```

理由は単純です。アカウントのパスワードは全機能にアクセスできてしまい、一つのリポジトリに限定することもできず、取り消しも面倒です。一方トークンは、特定の作業のために作られ、有効期限と権限のセットを持ち、漏えいした場合でもパスワードを変更せずにすぐ削除できます。GitLabやBitbucketも同じ方向に進んでいるため、以下の内容はそれらにも基本的に当てはまります。

## 認証の2つの方法: HTTPSとSSH

GitはリモートリポジトリとやりとりするためにHTTPSかSSHのどちらかのプロトコルを使います。どちらを使うかによって、ログインの方法が変わります。

| プロトコル | リポジトリのアドレス | 認証方法 |
| --- | --- | --- |

| HTTPS | `https://github.com/user/project.git` | トークン、またはGit Credential Manager（ブラウザーでログイン） |

| SSH | `git@github.com:user/project.git` | SSHキーのペア: 秘密鍵は手元、公開鍵はGitHubの設定に登録 |

SSHキーは一度設定すれば、Gitがログイン名もパスワードも尋ねなくなります。作成とGitHubへの登録の方法は、Gitの設定に関する記事で詳しく説明しています。ここではHTTPSに焦点を当てます。初心者がパスワードの入力を求められるのは、ほとんどの場合HTTPSです。リポジトリがどちらのプロトコルを使っているかは、次のコマンドで確認できます。

```
git remote -v
origin  https://github.com/user/project.git (fetch)
origin  https://github.com/user/project.git (push)
```

## GitHubのトークン（personal access token）の作り方

personal access tokenとは、パスワードの代わりにプログラムからGitHubにアクセスするために発行される、長くランダムな文字列です。classicトークンは `ghp_` で始まり、fine-grainedトークンは `github_pat_` で始まります。トークンは作成直後に一度だけ表示されるため、パスワードマネージャーにコピーして保存してください。

### 手順

1. github.comにログインし、右上のアバターをクリックして **Settings** を開きます。
2. 左メニューの一番下で **Developer settings**、続いて **Personal access tokens** を選びます。
3. 種類を選びます。**Fine-grained tokens**（推奨）か **Tokens (classic)** のどちらかで、新しいトークンを作成するボタンを押します。
4. 分かりやすい名前（例: 「ノートPC、仕事用」）、有効期限、権限を設定します。
5. 生成ボタンを押し、すぐにトークンをコピーします。

### Fine-grainedとclassicの違い

Fine-grainedトークンは、特定のリポジトリと個別の権限に限定できます。通常のコード作業では、必要なリポジトリを選び、リポジトリ権限で **Contents: Read and write** を設定します。これだけでclone、pull、pushが可能です。プライベートリポジトリを読むだけなら、Read-onlyで十分です。

classicトークンは、アカウントのすべてのリポジトリに効力を持ちます。リポジトリへのpushには `repo` スコープが必要で、`.github/workflows` のファイルを変更するには、さらに `workflow` スコープが必要です。classicは簡単ですが、漏えいするとアカウント全体にアクセスされる危険があります。

### 有効期限

GitHubは複数の有効期限を提供し、任意の日付も設定できます。期限のないトークンも作成できますが、おすすめはしません。使われなくなった無期限のトークンは、セキュリティ上の典型的な穴になります。30〜90日を目安に設定し、期限切れの前にGitHubから届くメールの通知を見て再発行するのが良い方法です。

## git pushとgit cloneでトークンを使う

トークンの使い方は、思ったよりも簡単です。Gitが「Password」と尋ねてくるので、パスワードの代わりにトークンを貼り付けます。

```
$ git push origin main
Username for 'https://github.com': your-login
Password for 'https://your-login@github.com':
```

ターミナルではパスワードの文字は表示されません。これは正常な動作です。トークンを貼り付けて Enter を押してください。Windowsのgit Bashでは、Shift+Insert または右クリックで貼り付けられます。

### トークンを使ったgit clone

プライベートリポジトリのcloneも同じように行います。`git clone` がログイン名とトークンを尋ねます。質問なしで進めたい場合（スクリプトなど）は、トークンをアドレスに直接埋め込みます。

```
git clone https://your-login:@github.com/user/project.git
```

欠点もあります。トークン付きのアドレスは `.git/config` に保存され、シェルの履歴に残る可能性があります。clone後は、アドレスからトークンを取り除くことをおすすめします。

```
git remote set-url origin https://github.com/user/project.git
```

CIシステムでは、トークンをファイルに書かず、シークレットの環境変数として渡します。GitHub Actionsでは、現在のリポジトリ用に組み込みの `GITHUB_TOKEN` が使えるため、個別のPATが不要なことが多いです。

### GitLab: トークンを使ったgit clone

GitLabでは、プロフィール設定の Access tokens でトークンを作成します。コードを扱うには `read_repository` と `write_repository` のスコープが必要です。仕組みは同じです。ユーザー名にはGitLabのログイン名を、パスワードの位置にはトークンを入力します。

```
git clone https://oauth2:@gitlab.com/group/project.git
```

GitLabは、個人用トークンに対してユーザー名 `oauth2` を受け付けます。自分のログイン名を指定することもできます。

### git pullとfetch

公開リポジトリでは、`git pull` と `git clone` は認証なしで動きます。ログイン名とトークンを求められるのは、プライベートリポジトリを扱うときか、`git push` を行うときだけです。公開プロジェクトで `git pull` がパスワードを求めてきた場合、アドレスのタイプミスであることがほとんどです。GitHubは存在しないリポジトリにも、非公開のリポジトリと同じ応答を返すためです。

## Git Credential Managerとは

pushのたびにトークンを入力するのは面倒です。この作業を引き受けるのが、credential helperと呼ばれる補助プログラムです。Gitは認証情報が必要になると、このプログラムを呼び出します。Gitはサーバーのアドレスを渡し、プログラムは自分の保管場所からログイン名とパスワード（またはトークン）を返します。

Git Credential Manager（GCM）は、最も便利なcredential helperです。GitHubとMicrosoftが提供するクロスプラットフォームのプログラムです。最初にpushするとログインウィンドウまたはブラウザーが開き、GitHubで認証します（二要素認証にも対応しています）。GCMがトークンを取得し、システムの安全な保管場所に保存します。この方法では、PATを手動で作成する必要はありません。

GCMはGitHub、GitLab、Bitbucket、Azure DevOpsに対応しています。Git for Windowsではデフォルトでインストールされ、インストーラーのcredential helperの選択項目に含まれています。

### credential.helperの種類

| 値 | 保存先 | 使う場面 |
| --- | --- | --- |

| `manager` | Git Credential Manager: Windowsの資格情報マネージャー、macOSのキーチェーン、LinuxのSecret Service | 業務用のPCに推奨される設定 |

| `osxkeychain` | macOSのキーチェーン | MacでのGitの標準的なhelper |

| `cache` | メモリ内、デフォルトは15分 | ディスクにトークンを保存したくないLinuxサーバー |

| `store` | `~/.git-credentials` に平文で保存 | 隔離された環境に限る。ファイルにアクセスできる人なら誰でもトークンを読める |

## Windows、macOS、Linuxでの認証設定

現在設定されているhelperを確認するには、次のコマンドを使います。

```
git config --show-origin --get-all credential.helper
```

### Windows

Gitのインストール時に初期設定のままにしていれば、GCMはすでに動いています。最初のpushで、Git Bash、PowerShell、またはVS Codeからサインインのウィンドウが開きます。helperが設定されていなければ、手動で有効にします。

```
git config --global credential.helper manager
```

### macOS

MacのGitは通常、`osxkeychain` を使います。一度入力したトークンは、キーチェーンに保存されます。ブラウザーでのログインを使いたい場合は、Git Credential Managerをインストールしてください（Homebrewを使うなら `brew install --cask git-credential-manager`）。インストール時に自分で設定を書き込みます。

### Linux

LinuxではGCMを別途インストールします（.debパッケージ、またはプロジェクトのリリースからのアーカイブ）。その後、設定と保存先を選びます。

```
git-credential-manager configure
git config --global credential.credentialStore secretservice
```

グラフィカル環境のないサーバーでは、一時的なキャッシュの方が簡単です。

```
git config --global credential.helper 'cache --timeout=3600'
```

### GitHub用の代替手段: gh auth login

GitHub CLIがインストールされていれば、`gh auth login` でブラウザーのログインを進められます。`gh auth setup-git` を実行すると、Gitが認証情報を `gh` から取得するように設定されます。これは、1つのコマンドで「Git Bashにログインする」ための便利な方法です。

## 保存されたGitのパスワードをリセット・更新する方法

よくあるケースは、トークンの期限が切れたり、アカウントを切り替えたりしたのに、Gitが古い情報を使い続けて `Authentication failed` になる場合です。保存された記録を削除すると、次のpushでGitが改めて尋ねてきます。

### どのhelperでも使える共通コマンド

```
printf "protocol=https\nhost=github.com\n\n" | git credential reject
```

### Windowsで認証情報をリセットする

「コントロール パネル」→「資格情報マネージャー」→「Windows資格情報」を開き、`git:https://github.com` のような項目を探して削除します。コマンドラインで行うこともできます。

```
cmdkey /list | findstr git
cmdkey /delete:git:https://github.com
```

GCMを使っている場合は、アカウントからログアウトするための専用コマンドもあります: `git credential-manager github logout <ログイン名>`。

### macOS

「キーチェーンアクセス」を開き、種類が「インターネットパスワード」の `github.com` を探して削除します。ターミナルから行うなら次のとおりです。

```
git credential-osxkeychain erase
host=github.com
protocol=https
```

最後の行の後で、空行を渡すためにもう一度 Enter を押します。

### Linuxとstore

`store` を使っている場合は、`~/.git-credentials` から github.com の行を削除します。`cache` の場合は、`git credential-cache exit` を実行します。

## 認証エラーの原因と対処法

### Support for password authentication was removed

アカウントのパスワードを入力しています。トークンを作成して Password 欄に貼り付けるか、Git Credential Managerを設定してください。パスワードの入力を求められないのにエラーが続く場合は、古いパスワードが保存されています。前述のとおり、その記録を削除してください。

### git push: Authentication failed

原因は、よくあるものから順に次のとおりです。トークンの期限切れ、トークンの取り消し、fine-grainedトークンにそのリポジトリへのアクセス権がない、またはContentsが読み取りのみになっている、保存された認証情報が別のアカウントのものである。Developer settingsでトークンの期限と権限を確認し、保存された認証情報をリセットしてください。

### remote: Permission denied (403)

認証は成功していますが、そのリポジトリへの書き込み権限がありません。オーナーにCollaboratorsへ追加してもらうか、自分のフォークとpull requestを使って作業してください。

### Repository not found

プライベートリポジトリの場合、GitHubはそのリポジトリが存在するかどうかを明かさないため、トークンが誤っていると「not found」と表示されます。`git remote -v` でアドレスを、トークンの権限を確認してください。

### git cloneのたびにパスワードを求められる

credential helperが設定されていません。`manager` か `osxkeychain` を有効にしてください。一度正しく入力すれば、Gitは尋ねなくなります。別の方法としては、SSHに切り替えることもできます。

## トークンを安全に保管する方法

- 権限は最小限にしましょう。`repo` を含むclassicトークンではなく、必要なリポジトリだけに限定したfine-grainedトークンを使います。
- 有効期限を設定し、無期限に延長し続けるのではなく、再発行してください。
- トークンをコミットしたり、remoteのアドレスに埋め込んだりしないでください。トークンが公開リポジトリに含まれると、GitHubが自動的に無効化することがあります。それでも漏えいしたものとして扱い、自分でも削除してください。
- `store` ではなく、システムの保管場所（GCM、キーチェーン）を使いましょう。
- 1つのトークンは1台のマシンまたは1つの作業に割り当てます。漏えいした場合でも、そのトークンだけを取り消せます。

## まとめ

GitHubのパスワードは、2021年以降HTTPS経由のGit操作では使えません。現実的な方法は3つです。ブラウザーでGit Credential Managerにログインする、GitHubのトークンを作ってパスワードの代わりに入力する、またはSSHキーに切り替える、のいずれかです。トークンはSettings → Developer settingsで作成し、credential.helperが保存します。Authentication failedが出た場合は、ほとんどの場合、トークンを再発行し、古い認証情報をリセットすれば解決します。GitHubへの接続やリモートリポジトリでの作業は、Gitのコースで実践的に扱っています。

## FAQ

**作成したGitHubのトークンを後から確認できますか？**

いいえ。GitHubはトークンを一度だけ表示します。保存し忘れた場合は、古いトークンを削除して新しく作成してください。

**公開リポジトリをcloneするのにトークンは必要ですか？**

いいえ。公開リポジトリは認証なしでclone、git pullできます。トークンが必要なのは、プライベートリポジトリを扱うときと、git pushを行うときです。

**トークンの期限が切れたらどうなりますか？**

Gitが Authentication failed を返すようになります。新しいトークンを作成し（古いトークンのRegenerateでも可）、保存された認証情報を削除してから、次のpushで新しいトークンを入力してください。

**GitHubのトークンは二要素認証と併用できますか？**

はい。二要素認証を有効にしている場合は、トークンが必要です。トークンはパスワードと確認コードの代わりになります。Git Credential Managerでブラウザーからログインする場合は、二要素認証にも自動的に対応します。

**Gitはログイン名とパスワードをどこに保存しますか？**

Git自身は保存しません。保存を担当するのはcredential helperです。Windowsの資格情報マネージャー、macOSのキーチェーン、LinuxのSecret Service、またはhelperにstoreを使った場合は ~/.git-credentials です。


---
Source: Skillaria.Top (https://skillaria.top)
