ふと職場の開発用パソコンから、普段どおりにGitHub上の修正済のコードをpullすると、以下のような症状でアクセス拒否されることがあります。

            $ git pull origin main
remote: Password authentication is temporarily disabled as part of a brownout. Please use a personal access token instead.
remote: Please see https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/ for more information.
fatal: unable to access 'https://github.com/**********/**************.git/': The requested URL returned error: 403

        

確かにそういえば、
2020年の暮れ頃からメールでもアナウンスされていた内容|Token authentication requirements for API and Git operations という話の通りで、GitHubの Mid-2021 – Personal access or OAuth tokens will be required for all authenticated Git operations. という大きな仕様変更があったので、しばらくリモートにアクセスしていないパソコンから久しぶりに動かしてみると、突如としてこの問題が火を噴くことがあります。
要するに、Gitコマンド操作全般に関して、従来のパスワード方式は利用不可となり、2021年中盤以降からは
「パーソナルアクセストークンかOAuthトークンによるアクセスが必須」 となります。
若干面倒ですが、セキュリティの面で優れている方式に移行せざるをえないことは前々から明白でしたので、今回はパーソナルアクセストークン方式のgithub認証にお引っ越しする手順を防備録的にまとめていきます。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

GitHubのパーソナルアクセストークンを新規発行する



パーソナルアクセストークンを生成するにはGitHubのダッシュボードから作業を行う必要があります。
まずはユーザーメニューから
[Settings] > [Developer settings] > [Personal access tokens] と辿ることでパーソナルアクセストークンのページに進みます。
470x687
合同会社タコスキングダム|蛸壺の技術ブログ


新しいトークンを生成するには
[Generate new token] ボタンをクリックします。
800x98
合同会社タコスキングダム|蛸壺の技術ブログ


すると新規作成するトークンの設定画面が表示されますので順次設定していきます。
有効期限切れの選択肢の中に1年間がないので、
Custom からカレンダーピッカーを利用して1年後の日付を設定します。 (もちろん1年よりもっと短くしたり、有効期限切れなしにもできるのでお好みで調整してください。)
724x352
合同会社タコスキングダム|蛸壺の技術ブログ


次に
アクセストークンの権限スコープ を選択します。
742x419
合同会社タコスキングダム|蛸壺の技術ブログ


個人的にgithubをどう操作したいかにもよりますが、著者の場合、CLIからレポジトリを操作したいので
repo 、AWS CodeBuildのようなIaCツールを利用してgithubアクセスする必要がある場合、 admin:repo_hook 、後は delete_repo なども追加しておくと良いでしょう。
認証トークンを選択したら
[Generate token] を押すと完了です。
248x53
合同会社タコスキングダム|蛸壺の技術ブログ


これでパーソナルアクセストークンが完成しました。
750x276
合同会社タコスキングダム|蛸壺の技術ブログ


これを何処かに控えておきまして、早速このトークンを使ってアクセス拒否されたレポジトリを再構成していきましょう。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

gitコマンドで再認証作業



gitを利用している環境がmacOSの場合にはまず
キーチェーンからの認証情報を更新する 必要があります。
Linuxの場合では、例えばグローバルでクレデンシャル情報を保管していた場合、クレデンシャルヘルパーを以下のコマンドでリフレッシュすることでgithubの古いキャッシュが消去できます。

            $ git config --global --unset credential.helper

        

これでグローバルに保管されていたクレデンシャル情報がリセットできました。
あとは通常のgitコマンドの操作で新しいパスワードが聞かれますので、控えていたパーソナルアクセストークンを使ってログインします。

            $ git clone https://github.com/************/**********.git
Cloning into '***************'...
Username for 'https://github.com': [ユーザー名]
Password for 'https://ユーザー@github.com': [パーソナルアクセストークン]

        

通常はgitコマンドをターミナルで叩いてから、このクレデンシャルをgitに覚えさせるために
git config credential.helper store 等を使ってローカルに保存する方法が従来の定石ですが、開発ツールとしてVS Codeを使っている場合、VS Codeの統合ターミナルから操作をやってみると、以下のようなVSCode-GitHub提携ページに飛ばされるようになっています。
907x382
合同会社タコスキングダム|蛸壺の技術ブログ


ボタンをいくつかポチポチするだけで、gitコマンドが利用できているので、VSCodeが自動でクレデンシャルを保存・管理してくれる仕様になっています。
GitHubは既にMicroSoft社傘下になっているので、VS Codeとの連携はかなり進んでいるように感じました。
ひとまずはパーソナルアクセストークン方式にお引越し完了しましたので、とりあえず次のトークンの有効期限が切れるまでは一安心です。


合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

トークンの有効期限が切れた後のパーソナルアクセストークン再設定



※この節は2023年12月に更新した内容です。
弊社の利用するアクセストークンでは、
有効期限1年 と決めて運用しています。
なので気づいた頃に、ふとgithubを操作していたら、ちょうど有効期限切れになってしまうこともあります。
gitコマンドの利用環境によっても、警告メッセージも少々異なるようです。
例えば、

            $ git clone https://github.com/***************/*************.git
Cloning into '*************'...
Username for 'https://github.com': *************
Password for 'https://***********@github.com':
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/**********/*********/'

        

とか、

            $ git pull origin main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
hint: Pulling without specifying how to reconcile divergent branches is
#...省略
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com//**********/*********.git/'

        

とか、

            $ git push origin main
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/***************.git/'

        

などなど、あらゆるリモート側へのgit操作に何かしらの警告が出てきます。
ということでこの場合、
「新しいパーソナルアクセストークン」 を再発行し、ユーザーにその旨を通知し、また有効期限1年で使ってもらうことにします。
管理者側は、パーソナルアクセストークンを再生成すれば良いですが、この場合、ユーザー側も利用中のgit環境の更新作業が必要です。

リモート管理者側のアクセストークン再発行作業



先程までの内容の繰り返しとなりますが、パーソナルアクセストークンをGitHubダッシュボードから再度発行していきます。
ユーザーメニューから
[Settings] > [Developer settings] > [Personal access tokens] と辿ることでパーソナルアクセストークンのページに入ります。
800x480
合同会社タコスキングダム|蛸壺の技術ブログ


なお、2023年12月現在で、パーソナルアクセストークンは2種類になり、従来のものは「Classic」、この直近で追加され現在はベータで使えるようになっている「Fine-grained」の2つが選べます。
今回もClassicのままで再発行しますが、機会があれば次世代のパーソナルアクセストークンであるFine-grainedについても解説してみる予定です。
さて、一度有効期限の切れたアクセストークンは、削除以外の選択肢はないので、
[Delete] ボタンで抹消します。
457x267
合同会社タコスキングダム|蛸壺の技術ブログ


古いアクセストークンが抹消できたら、新規トークンと同じ手順でClassicの方を作り直します。
787x701
合同会社タコスキングダム|蛸壺の技術ブログ


権限スコープはGitHubを利用される目的別に、色々とユーザーによって異なるかとは思いますが、
著者的には、CLIからレポジトリを操作したいので
repo 、AWS CodeBuildのようなIaCツールを利用してgithubアクセスする必要がある場合に admin:repo_hookread:orgdelete_repo くらいを追加しておく感じにします。
795x295
合同会社タコスキングダム|蛸壺の技術ブログ


あとはこのアクセストークンを生成すると再発行作業は完了です。

ユーザー側のgit環境周りの更新作業




古いパスワードがキャッシュされているままでは使えないので、一度環境に仕込まれているクレデンシャルをリセットしましょう。
gitコマンドのクレデンシャルの保存先としては
local / global / system の3つ権限範囲指定ができます。
これは
[local] > [global] > [system] の順でクレデンシャル設定が優先される仕様です。
どこにクレデンシャルを仕込んであるかを確認するには、
git config --list コマンドで、どれかを引数にしてみます。
例えば、
global に仕込んである場合には、

            $ git config --global --list
credential.https://github.com.helper=
credential.https://github.com.helper=!/home/linuxbrew/.linuxbrew/Cellar/gh/2.32.1/bin/gh auth git-credential
credential.https://gist.github.com.helper=
credential.https://gist.github.com.helper=!/home/linuxbrew/.linuxbrew/Cellar/gh/2.32.1/bin/gh auth git-credential
user.email=t*************************p
user.name=**************
credential.helper=store

        

となって、
credential.helper=store が、globalにクレデンシャルを保存してあることを示しています。
環境に仕込まれているクレデンシャルを利用環境に合わせて以下のコマンドのどれかでリセットします。

            #👇パスワードをグローバル(ユーザー全体)で使っている場合
$ git config --global --unset credential.helper
#👇パスワードをローカル(対象リポジトリのみ)で使っている場合
$ git config --local --unset credential.helper
#👇パスワードをシステム(gitコマンド共有)で使っている場合
$ git config --system --unset credential.helper

        

注意しておきたいのは、ローカルとグローバル(かシステム)に同じクレデンシャル情報をうっかり仕込んでしまったら、仮に特定のフォルダでローカル設定を解除した場合、次はグローバル(かシステム)のクレデンシャル情報が適用されることになります。
このとき当然、グローバル(かシステム)のクレデンシャル情報が先に更新されていた場合、ローカルのクレデンシャル情報をリセットしたにも関わらず、該当のレポジトリにアクセスできてしまいます。
gitできちんとした運用を考えると、
「クレデンシャルを保存する際に、ローカルとグローバルとシステムを混合させてはいけない」 ということは、最初に考えておかないといけません。
ともかくきっちりとパスワード情報が空の状態にまで戻した後で、再度gitコマンドを操作してみると、

            $ git clone https://github.com/***********/***********.git
Cloning into '***********'...
Username for 'https://github.com': ***********
Password for 'https://***********@github.com': 
remote: Enumerating objects: 76, done.
remote: Counting objects: 100% (76/76), done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 76 (delta 33), reused 57 (delta 19), pack-reused 0
Unpacking objects: 100% (76/76), done.

        

と、新たにユーザー名とパスワードが聞かれて、認証後にまた作業を再開することができます。

なお、繰り返しになりますが、新しいパスワードをgitにキャッシュさせるためには、

            $ git config [--global/--local/--system] credential.helper store

        

を叩いてから、ユーザー名と新しいパスワードを入力することで、次回の操作からは認証を聞かれなくすることができます。

余談ですが、クレデンシャルを消去した後で、さらにユーザー名とパスワードが無効になっているというエラーが継続して出てしまうこともあります。
そういった症状に遭遇したら、おとなしくユーザー名とパスワードも一旦リセットしましょう。
globalスコープに設定していた場合には以下のようにしてリセットを行います。

            $ git config --global --unset-all user.name
$ git config --global --unset-all user.email

#👇リストでユーザー名・emailが消えているかを確認
$ git config --global --list
credential.https://github.com.helper=
credential.https://github.com.helper=!/home/linuxbrew/.linuxbrew/Cellar/gh/2.32.1/bin/gh auth git-credential
credential.https://gist.github.com.helper=
credential.https://gist.github.com.helper=!/home/linuxbrew/.linuxbrew/Cellar/gh/2.32.1/bin/gh auth git-credential

        

これで再度、git操作を行って、エラーが消えるかを試しましょう。
それでも治らないようであれば、gitコマンドの内部エラー(環境でHTTPSとSSHを混合している等)ということも考えられます。
参考として、以下の記事の内容を試されると良いでしょう。

参考|GitHub へのアクセスで remote: Invalid username or password と言われたので、git remote set-url でリポジトリを指定した。
合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

GitHubアカウントへ2段階認証(2FA)を追加する



去年2023年の暮れあたりから、GitHubのダッシュボードのトップに貼り付くようになったメッセージがあります。
889x115
合同会社タコスキングダム|蛸壺の技術ブログ


個人的に時間に追われ、しばらく無視してきましたが、しかたないのでここいらで対応してみます。
早速、2段階認証を有効にすべく
[Enable 2FA] をクリックしてみます。
318x483
合同会社タコスキングダム|蛸壺の技術ブログ


パスワードが要求されますので、入力後に
[Confirm] をクリックします。
次に進むと、2段階認証の方法が聞かれます。
490x657
合同会社タコスキングダム|蛸壺の技術ブログ


選択肢としては、スマホアプリで使うワンタイムパスワード方式の
1PasswordAuthy 等の認証アプリを使うか、SMSメッセージでワンタイムパスワードを受け取るかのどちらかが選択できます。
ここでは認証アプリを使います。
スマホに適当な認証アプリをインストールし、中央に表示されたQRコードを読み込んでGitHubアカウントを登録しましょう。
認証アプリに登録後、即時ワンタイムパスワードの発行がスタートしていると思います。
このワンタイムパスワードを、
[Verify the code from the app] のテキスト入力欄に打ち込んで設定が有効になったかを確認します。
問題なく2段階認証が登録できたら、次にリカバリーコード(認証アプリを入れたスマホを紛失したときなどの備え)を保存して、適切な場所でデータを管理しておきます。
484x555
合同会社タコスキングダム|蛸壺の技術ブログ
[Download] をクリックして、リカバリーコードのテキストファイルを保存し、このファイルは第三者の入手できないところで管理します。
しっかりとダウンロードしたあとで、
[I have saved my recoverry codes] をクリックし次に進みます。
500x574
合同会社タコスキングダム|蛸壺の技術ブログ


最後に、2段階認証の設定が完了した旨の画面が表示されます。
お疲れ様でした。 これで、GitHubのダッシュボードのログイン時にワンタイムパスワードが要求されるようになったはずです。
なお、スマホも紛失・故障した、リカバリーコードも失くした、という不安がある方は、必要に応じて
Passkeys などを追加で設定することも可能です。



合同会社タコスキングダム|蛸壺の技術ブログ【効果的学習法レポート】シェルスクリプトをこれから学びたい人のためのオススメ書籍&教材特集

参考サイト

Token authentication requirements for API and Git operations個人アクセストークンを使用する