はじめに
VSCodeServer環境で、今まで普通に使えていた git pull が急にエラーになりました。
remote: Invalid username or token.
Password authentication is not supported for Git operations.
fatal: Authentication failed for 'https://github.com/xxx/xxx.git'
「え、先月まで使えてたのに…?」となったので、原因と対処法をまとめます。
対象読者
- VSCodeServer環境でGitHubのprivateリポジトリを使っている方
- 急にgit操作で認証エラーが出て困っている方
原因
1. GitHubはパスワード認証を廃止済み
2021年8月13日以降、GitHubではHTTPS経由のパスワード認証が使えなくなっています。代わりにPersonal Access Token(PAT)やSSH鍵での認証が必要です。
2. 別のGitサービス用のcredential helperが設定されている
gitの credential.helper は、git操作時に認証情報を自動的に提供する仕組みです。今回の環境では、以前CodeCommitを利用していたため、CodeCommit用のcredential helperが設定されたままになっていました。
$ git config --list | grep credential
credential.helper=!aws codecommit credential-helper $@
credential.usehttppath=true
この設定が残っている状態でGitHubにアクセスすると、gitはCodeCommit用のcredential helperを使って認証しようとします。当然GitHubには対応していないため、認証に失敗します。
これはCodeCommitに限った話ではなく、例えばGitLab用やBitbucket用など、別のGitサービス向けのcredential helperが設定されている場合にも同様の問題が発生します。要するに、接続先のGitサービスとcredential helperの組み合わせが一致していないと認証エラーになります。
3. 以前使えていた理由
以前は環境のどこかにGitHubの認証情報(PATなど)がキャッシュされていた可能性が高いです。gitは認証時にキャッシュされた認証情報を優先的に使うため、credential helperの設定が別サービス向けでも問題なく動作していました。
しかし、環境の再起動やリビルド、キャッシュの期限切れなどでその認証情報が消えると、gitはcredential helperに認証を委任します。その結果、別サービス向けのcredential helperがGitHubに対して無効な認証情報を返してしまい、エラーが発生します。
対処法:Personal Access Token(PAT)の発行と設定
ステップ1:GitHubでPATを発行する
- GitHubにログイン
- Settings → Developer settings → Personal access tokens → Tokens (classic) に移動
- Generate new token (classic) をクリック
設定項目
| 項目 | 設定値 | 備考 |
|---|---|---|
| Note | 任意の名前(例: vscode-server-myproject) |
何に使っているかわかる名前にする |
| Expiration |
90 days 推奨 |
No expiration も可能だがセキュリティ的には期限付きが望ましい |
| Select scopes |
repo にチェック |
privateリポジトリへのフルアクセスが可能になる |
- Generate token をクリック
- 表示されたトークンを必ずコピーする(この画面を閉じると二度と表示されません)
⚠️ Fine-grained token ではなく Tokens (classic) を使う理由
Fine-grained tokenでは、組織(Organization)のリポジトリを選択するために組織側の管理者がFine-grained PATを許可している必要があります。許可されていない場合、privateリポジトリが選択肢に表示されません。Tokens (classic) であればこの制限を受けません。
ステップ2:リモートURLにトークンを設定する
git remote set-url origin https://<GitHubユーザー名>:<PAT>@github.com/<組織名>/<リポジトリ名>.git
例:
git remote set-url origin https://myuser:ghp_xxxxxxxxxxxx@github.com/my-org/my-repo.git
ステップ3:動作確認
git pull
正常にpullできれば成功です。
別の方法:credential helperでトークンを保存する
リモートURLにトークンを埋め込みたくない場合は、GitHub専用のcredential helperを追加する方法もあります。
# GitHub用にstore helperを設定
git config --global credential.https://github.com.helper store
# git pullを実行(認証を聞かれる)
git pull
# ユーザー名: GitHubユーザー名
# パスワード: PAT(トークン)
一度入力すれば ~/.git-credentials に保存され、以降は聞かれなくなります。
トークンの有効期限が切れたら
PATに有効期限を設定した場合、期限が来ると再び同じエラーが発生します。その際は以下の手順で対応してください。
- GitHubで新しいPATを発行する
-
git remote set-urlで新しいトークンに更新する(またはcredential storeの場合は~/.git-credentialsを更新する)
まとめ
| 項目 | 内容 |
|---|---|
| エラー原因 | GitHubのパスワード認証廃止 + 別サービス向けcredential helperとの不一致 |
| 対処法 | GitHub PAT(Tokens classic)を発行してリモートURLに設定 |
| Fine-grained tokenの注意点 | 組織の設定次第でprivateリポジトリが選択できない場合がある |
| トークン期限 | 90日推奨。期限切れ時は再発行して更新 |
VSCodeServer環境でGitHubを使う場合、CodeCommitのcredential helperとの共存がポイントです。一度設定してしまえば快適に使えるので、同じ問題に遭遇した方の参考になれば幸いです。