プログラミング

Gitでエラー”remote: Support for password authentication was removed”が起こる

gitでgithubなどのリモートにリポジトリをpushしようとする場合に、remote: Support for password authentication was removed・fatal: Authentication failedエラーが起こる場合の対処方法について紹介します。
また、後半ではgithub上でアクセストークンを作成する方法について触れます。

エラーremote: Support for password authentication was removed

gitプロジェクト上でgit pushを行うと以下のようなエラーになる場合があります。

$ git push -u origin main
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/user/repo.git/'

エラーメッセージの通り、gitでpushなどする際に要求されるパスワードは、いままではプレーンのパスワード文字列を入力していましたが、2021年後期よりトークンでの認証方式に変更となりました。

このエラーが起こる主な要因は以上の通り、passwordプロンプトでトークンを入力するべきところに以前のパスワード、githubにログインする際に使用するパスワードなどを入力した場合やそれがキャッシュされているような場合に起こります。

以下にgithubでアクセストークンを作成する手順を紹介します。

以下のページへ移動します。

GitHub Apps

“Personal access tokens”へと進み、generate new tokenをクリック
必要なパーミッションを選択し、作成を終了します。
私の場合はrepo(リポジトリ)をクリックし、git pushなどを含めたリポジトリ周りの作業ができるようにしました。

githubのgenerate new token

githubのPersonal access tokens

アクセストークンの作成が完了すると以下のようなページへ移ります。
“ghp_”からはじまる文字列がトークンになります。これをgithubへのgit pushなどの際にプロンプトされるパスワード・passwordでgithubのパスワードの代わりにコピーアンドペーストします。

githubでアクセストークンを作成

設定を何もしていない状態では、git pushなどをするごとに毎度パスワード(アクセストークン)が要求されることになります。
これでは作業効率が悪くなるため、以下のように一定期間の間アクセストークンをキャッシュまたはファイルに保存します。

* 前者のキャッシュではより安全ですが、後者のファイルに保存する方法はよりインセキュアです。具体的には、例えば悪意のあるnodejsのnpmモジュール・ライブラリなどがアクセストークンにアクセスできてしまう場合があります。

キャッシュに保存する場合は以下になります。

以下コマンドの例ではタイムアウトを3600秒、一時間に設定しています。つまり、最初のgit pushでアクセストークンを入力しキャッシュされてから、一時間の間は再度アクセストークンを入力せずにgit pushやgitコマンドが可能になります。

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

ファイルに保存する場合

git config --global credential.helper 'store'

ファイルに保存された場合、特に設定が変更されていなければ以下のファイルパスにトークンデータが保存されます。

~/.git-credentials

以下コマンドで保存されたトークンデータを出力できます。

cat ~/.git-credentials

参考:

Creating a personal access token – GitHub Docs

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です