手順

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

更新日: · Skillaria.Top

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のどちらかのプロトコルを使います。どちらを使うかによって、ログインの方法が変わります。

プロトコルリポジトリのアドレス認証方法
HTTPShttps://github.com/user/project.gitトークン、またはGit Credential Manager(ブラウザーでログイン)
SSHgit@github.com:user/project.gitSSHキーのペア: 秘密鍵は手元、公開鍵は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:<TOKEN>@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:<TOKEN>@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の種類

値保存先使う場面
managerGit Credential Manager: Windowsの資格情報マネージャー、macOSのキーチェーン、LinuxのSecret Service業務用のPCに推奨される設定
osxkeychainmacOSのキーチェーン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のコースで実践的に扱っています。

よくある質問

作成した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 です。

動画でこのテーマを学ぶ

このテーマはコース「Git:初心者から自信を持って使える開発者へ」で実践とともに詳しく解説しています。

コースへ