本記事の使用環境
MacOS バージョン15.6.1
ターミナル(MacやLinuxにデフォルトである)
はじめに
Macのターミナルでgit push origin {branch名}
をコマンドで入力し、実行したときに以下のようなエラーが出てきました。
remote: {"auth_status":"access_denied_to_user","body":"Permission to [ユーザ名]/{リポジトリ名}.git denied to [ユーザ名]."} fatal: unable to access 'https://github.com/[アカウント名]/{リポジトリ名}.git/': The requested URL returned error: 403
まず焦りました。今後、この道を通る方もいらっしゃると思うので、備忘録として残します。
ということで、これが何なのか、この後の対処法についてざっくりと解説していきます。
なぜエラーが出てきた?
まずはこのエラーが何なのかについてです。
403エラーとは
数字がついたエラーは『ステータスコード』と呼ばれます。
それぞれ番号には何が原因でエラーが起きている、あるいは成功しているのかが分かります。
400番台は基本的にクライアント側のエラーです。つまり、インターネットのサービスを利用している者側のエラーです。
403エラーは、認証されていないなどの理由でクライアントにコンテンツのアクセス権がないことに関して、クライアントに知らせています。
要するに
GitHub への権限不足が原因。なので、[ユーザ名] が {リポジトリ名} へアクセスできない状態をさす(ここではpush権)
この後の対処法
まずは、現状確認です。
現在のリモート設定確認
以下のコマンドを入力してください。
git remote -v
その際に、以下のようになっているか。
origin https://github.com/[ユーザ名]/{リポジトリ名}.git (fetch)
origin https://github.com/[ユーザ名]/{リポジトリ名}.git (push)
誤りがあるなら
git remote set-url origin https://github.com/[ユーザ名]/{リポジトリ名}.git
を実行。
SSHでも可能。git remote set-url origin git@github.com:[ユーザ名]/{リポジトリ名}.git
自分のGitHubアカウントがリポジトリにアクセスできるかブラウザで確認
- 見れるけど push できない → コラボレーター権限がない
- 見れない → リポジトリが存在しないか、プライベート設定で招待されていない
僕の場合は「見れるけど push できない」状態でした。つまり、push権のみなし。
実は…
補足ですが、GitHub上の「developer settings」で1つのトークンで、アクセス権を持つリポジトリを設定できるのですが、今回、全てのリポジトリに対して、アクセス権を付与していましたが、403エラーでした。
トークン認証キャッシュの問題
macOS や Windows では、古い認証情報が Credential Manager にキャッシュされていることがあります。新しいトークンを発行しても、古い情報を参照してしまうと 403 エラーになります
なので、まずはキャッシュを消去し、その後、新しくトークンを発行し、登録する必要があります!
git credential-osxkeychain erase
host=github.com
protocol=https
<空行を打って終了>
その後、トークンのつくり直し。
まずは GitHub のサイトにいく。その後、Settings から「Developer settings」 へ。「Personal access tokens」で『Fine-grained』をクリック。
注意
対象リポに Repository permissions: Contentsを絶対に入れてください。そうしないとpushできません!! Contentsは Read でも Read/Write でもどちらでも。
トークンが発行できたら
以下のコマンドをうち、登録してください。
git push origin {branch名}
# ユーザー名:あなたの GitHub ユーザー
# パスワード:PAT(生成したトークン文字列)
最初のクローンから行う場合は、トークンの登録をした状態でgit clone https://github.com/{ユーザ名}/{リポジトリ名}.git
のコマンドを入力。
トークンをいちいち発行したくないなら
SSHでの登録が便利です。
HTTPSだと、どうしてもトークンが必要です。
参考