git cloneで403エラーが出る時の対処法

あるあるです。「ブラウザでは見えるのに git clone で403」というパターンは、ほぼ間違いなく権限の問題ではなく、ターミナル側の認証情報の問題です。会社のOrganizationリポジトリで起きやすい原因を、よくある順に挙げますね。

1. SAML SSOの未authorize(会社利用で一番多い) 会社のOrganizationがSAML SSO(Okta、Azure AD、Google Workspaceなど)でログインを統合している場合、ブラウザはSSOセッションで通っても、ターミナルから使うPATやSSH鍵は「SSO authorize」を別途行わないと使えません。ブラウザで Settings → Developer settings → Personal access tokens を開くと、各PATの横に「Configure SSO」ボタンがあるので、そこで対象Organizationを authorize すると解消します。SSH鍵も同様で、Settings → SSH and GPG keys の各鍵にSSO authorizeのリンクがあります。

2. PATのスコープ(権限範囲)不足 古いClassic PATで repo スコープを付け忘れていたり、Fine-grained PATで対象リポジトリを選択していない、あるいはRepository permissionsで「Contents: Read」を付けていないと403になります。Fine-grained PATは特に細かく、リポジトリごとに明示指定が必要なので見落としやすいです。

3. 認証情報のミスマッチ(macOS Keychain問題) Macだとmacの「キーチェーンアクセス」または git credential-osxkeychain昔の別アカウントのPAT/パスワードが残っていることがよくあります。会社用と個人用のGitHubアカウントを切り替えている人は特に。古いキャッシュで認証しようとして403になります。キーチェーンから github.com のエントリを削除して、再度cloneしてPATを入れ直すと直ります。

4. IP allow list(会社のセキュリティ設定) OrganizationがIP制限をかけていて、社内VPN経由でないとアクセスできないケース。ブラウザはVPN通っているのにターミナルだけVPN外、みたいな状況だと403になります。

5. SSH鍵が別アカウントに紐づいている SSH cloneしている場合、ssh -T git@github.com で「Hi xxxxx!」と返ってくるユーザー名が、リポジトリにアクセス権を持つアカウントと違うと403になります。

6. Branch protection / Push制限と勘違い 「クローン時に403」ではなく「push時に403」を見間違えているケース。これは権限不足ですが、cloneそのものは成功します。

まず最初にやるべき切り分け

  • git remote -v でURLを確認(HTTPS or SSH)
  • HTTPSなら git config --global credential.helper の中身を確認し、キーチェーンに古い認証が残っていないか
  • SSHなら ssh -T git@github.com でどのアカウントとして認証されているか確認
  • どちらの方式でも、ブラウザでPATまたはSSH鍵の管理画面を開き、該当Organizationが「SSO authorized」になっているか確認

会社環境であれば、私の経験上 SAML SSOのauthorize忘れ が圧倒的に多いです。一度試してみてください。どの認証方式(HTTPS/SSH)でcloneしようとしているか教えてもらえれば、もう少し絞り込めますよ。

結論。

SSO認証が原因であることがほとんど。

今回認証するSSOについて補足。

SAML SSO って何?
会社が「うちの社員がGitHubにアクセスするときは、会社のIDシステム(Okta、Azure AD、Google Workspaceなど)を経由してログインしてね」と決めている仕組みです。これにより会社は「誰がいつGitHubを使っているか」を一元管理できます。ブラウザでGitHubにアクセスすると、たまに「会社のSSOでログインしてください」というページに飛ばされるのはこれです。

ここで起きる問題
ブラウザは「SSOでログインした」という状態をCookieで覚えているので普通に使えます。でも、ターミナルから git clone するときに使う PAT(Personal Access Token)や SSH鍵 は、ブラウザのCookieとは別物です。GitHub側から見ると「このトークン、SSO通ってないけど会社のリポジトリにアクセスしようとしてるな」となり、ブロックされて403になります。

「Configure SSO で authorize する」が何をしているか
これは要するに、「このPAT(またはSSH鍵)を、〇〇株式会社のOrganizationに対して使うことを許可します」と宣言する作業です。一度authorizeすると、GitHubは「このトークンはSSO認証済みのユーザーが発行したものだ」と紐づけてくれて、ターミナルから使ってもブロックされなくなります。

具体的な操作手順
ブラウザでGitHubにログインした状態で:

  1. 右上の自分のアイコン → Settings をクリック
  2. 左サイドバーの一番下あたり Developer settings をクリック
  3. Personal access tokensTokens (classic) または Fine-grained tokens
  4. 自分のPATの一覧が表示されるので、cloneに使っているトークン名をクリック(または横の「Configure SSO」ボタン)
  5. 会社のOrganization名が並んでいるので、対象の組織の横にある 「Authorize」 ボタンを押す
  6. 会社のSSOログイン画面に飛ぶので、いつものSSOで認証
  7. 戻ってきて「Authorized」と表示されればOK

SSH鍵の場合も同じ流れで、Settings → SSH and GPG keys → 該当の鍵の「Configure SSO」 → 対象Organizationを Authorize、です。

イメージとしては、PATやSSH鍵そのものは「家の鍵」、SSO authorizeは「会社の受付に『この鍵を持った人を入れていいよ』と登録する作業」みたいな感じです。鍵を持っていても、受付に登録されていないとロビーに入れない、というイメージです。

これをやった後にもう一度 git clone すれば、たいてい403は解消します。試してみてください。

最新記事
  • カテゴリー
  • 月別
  • Twitter

    ココナラでデザインを依頼する

    7000本の授業が見放題!社会人向けオンライン学習動画【Schoo(スクー)】

    Webデザイン業界特化のレバテック

    定額制で質問し放題【Web食いオンラインスクール】

    関連記事

    最新記事NEW

    CONTACTCONTACT CONTACTCONTACT

    お問い合わせ

    ご意見やお仕事のご依頼などは以下よりご連絡ください。

    情報入力

    内容確認

    完了

      お名前必須

      フリガナ必須

      メールアドレス必須

      お問い合わせ内容