カテゴリー
【GitHubよもやま話】GitHubへのアクセスをパーソナルアクセストークン方式にお引越しさせてみた
※ 当ページには【広告/PR】を含む場合があります。
2021/07/29
2024/01/10

ふと職場の開発用パソコンから、普段どおりに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
確かにそういえば、
Mid-2021 – Personal access or OAuth tokens will be required for all authenticated Git operations.
要するに、Gitコマンド操作全般に関して、従来のパスワード方式は利用不可となり、2021年中盤以降からは
若干面倒ですが、セキュリティの面で優れている方式に移行せざるをえないことは前々から明白でしたので、今回はパーソナルアクセストークン方式のgithub認証にお引っ越しする手順を防備録的にまとめていきます。
GitHubのパーソナルアクセストークンを新規発行する
パーソナルアクセストークンを生成するにはGitHubのダッシュボードから作業を行う必要があります。
まずはユーザーメニューから
[Settings] > [Developer settings] > [Personal access tokens]
470x687

新しいトークンを生成するには
[Generate new token]
800x98

すると新規作成するトークンの設定画面が表示されますので順次設定していきます。
有効期限切れの選択肢の中に1年間がないので、
Custom
724x352

次に
742x419

個人的にgithubをどう操作したいかにもよりますが、著者の場合、CLIからレポジトリを操作したいので
repo
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
907x382

ボタンをいくつかポチポチするだけで、gitコマンドが利用できているので、VSCodeが自動でクレデンシャルを保存・管理してくれる仕様になっています。
GitHubは既にMicroSoft社傘下になっているので、VS Codeとの連携はかなり進んでいるように感じました。
ひとまずはパーソナルアクセストークン方式にお引越し完了しましたので、とりあえず次のトークンの有効期限が切れるまでは一安心です。
トークンの有効期限が切れた後のパーソナルアクセストークン再設定
※この節は2023年12月に更新した内容です。
弊社の利用するアクセストークンでは、
なので気づいた頃に、ふと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操作に何かしらの警告が出てきます。
ということでこの場合、
管理者側は、パーソナルアクセストークンを再生成すれば良いですが、この場合、ユーザー側も利用中の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
admin:repo_hook
read:org
delete_repo
795x295

あとはこのアクセストークンを生成すると再発行作業は完了です。
ユーザー側のgit環境周りの更新作業
古いパスワードがキャッシュされているままでは使えないので、一度環境に仕込まれているクレデンシャルをリセットしましょう。
gitコマンドのクレデンシャルの保存先としては
local
global
system
これは
[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
環境に仕込まれているクレデンシャルを利用環境に合わせて以下のコマンドのどれかでリセットします。
#👇パスワードをグローバル(ユーザー全体)で使っている場合
$ 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アカウントへ2段階認証(2FA)を追加する
去年2023年の暮れあたりから、GitHubのダッシュボードのトップに貼り付くようになったメッセージがあります。
889x115

個人的に時間に追われ、しばらく無視してきましたが、しかたないのでここいらで対応してみます。
早速、2段階認証を有効にすべく
[Enable 2FA]
318x483

パスワードが要求されますので、入力後に
[Confirm]
次に進むと、2段階認証の方法が聞かれます。
490x657

選択肢としては、スマホアプリで使うワンタイムパスワード方式の
1Password
Authy
ここでは認証アプリを使います。
スマホに適当な認証アプリをインストールし、中央に表示されたQRコードを読み込んでGitHubアカウントを登録しましょう。
認証アプリに登録後、即時ワンタイムパスワードの発行がスタートしていると思います。
このワンタイムパスワードを、
[Verify the code from the app]
問題なく2段階認証が登録できたら、次にリカバリーコード(認証アプリを入れたスマホを紛失したときなどの備え)を保存して、適切な場所でデータを管理しておきます。
484x555

[Download]
しっかりとダウンロードしたあとで、
[I have saved my recoverry codes]
500x574

最後に、2段階認証の設定が完了した旨の画面が表示されます。
お疲れ様でした。 これで、GitHubのダッシュボードのログイン時にワンタイムパスワードが要求されるようになったはずです。
なお、スマホも紛失・故障した、リカバリーコードも失くした、という不安がある方は、必要に応じて
Passkeys
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー