GitHubのプライベートリポジトリのpush/pullで突然ユーザ名パスワードが要求されるようになった時の対応
TL;DR
clone済みのGitHubのプライベートリポジトリに対するpush/pullが,急にできなくなってしまいました. ユーザ名パスワードでの認証は結局できなかったので,トークンでの認証に切り替えました.
状況
ある日,clone済みのプライベートリポジトリに対してpullすると,認証を要求され,正しい(GitHubのWebサイトでは通る)認証情報を入力しても,認証が通らなくなりました.
$ git pull
Username for 'https://github.com': ottijp
Password for 'https://ottijp@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/ottijp/REPO_NAME/'
4月末には問題なくpushできていたリポジトリで,全く別の環境で新しくcloneしようとしても,同様に認証が通りませんでした.
また,この時,キーチェーンにはgithub.com
のエントリがありませんでした.(以前からあったかどうかは確認していませんでしたが,後述する対応方法でうまく動作した後では,エントリができていました.)
ググると,2段階認証を設定したりパスワードを変更した後でこのような症状が出るとの情報がありましたが,2段階認証は設定していないし,パスワードの変更もしていません.
対応
一応,試しにoriginのURLをssh(git@github.com:ottijp/REPO_NAME.git
)に変えて鍵認証でアクセスすると正常にpullはできたのですが,
httpsでしかアクセスできない環境からも使う予定があったので,元のhttpsのoriginのままで認証を通す方法を考えました.
git credential-osxkeychain
でキーチェーンのエントリをいじってみたり,GIT_TRACE=true
としてトレースログをチェックしたり,色々試しましたが,結局ユーザ名パスワードではどうやっても認証が通りませんでした.
そこで,2段階認証設定時の対応と同様に,アクセストークンを発行して,パスワードにそのトークンを入力することで,正常に動作するようになりました.
参考: GitHub で 2FA 設定済アカウントの Private Repository をクローン - to-me-mo-rrow - 未来の自分に残すメモ -
- GitHubの
Settings > Developer setting > Personal access tokens
ページで新しくトークンを発行 - 以下のようにパスワードの代わりにトークンを入力
$ git pull
Username for 'https://github.com': ottijp
Password for 'https://ottijp@github.com': (←ここにパスワードではなくトークンを入力)
Already up to date.
認証が通ったあとはキーチェーンにエントリができていて,以後はこれがcredential helperとして使われ,ユーザ名パスワード(トークン)入力は要求されませんでした.
$ git pull
Already up to date.
$ echo host=github.com | git credential-osxkeychain get
password=xxxxxxxxxxxxxxxxxx
username=ottijp