Azure DevOps の「fatal: Authentication failed for 'https://dev.azure.com/…'」
(「'https://dev.azure.com/…' の認証に失敗しました」)git が送ったパスワードに Azure DevOps が HTTP 401 で答えると、git はこう出します。Azure Repos では、そのパスワードは個人用アクセス トークン(PAT)か、Git Credential Manager がサインインに使う OAuth のトークンです。Azure DevOps は断った理由を返しません。答えは空です。なので、トークンの側を確かめます。期限が切れた、取り消された、無効になった、別の組織用に作った、Code の権限が無い、またはアカウントが入れなくなった、のどれかです。
答えの全体
dev.azure.com が2026年10月28日に、実在する組織のリポジトリについて、受け付けないトークンに返した答えです。
git ls-remote https://dev.azure.com/<組織>/<プロジェクト>/_git/<リポジトリ> fatal: Authentication failed for 'https://dev.azure.com/<組織>/<プロジェクト>/_git/<リポジトリ>/'
その裏の HTTP の答え:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="https://tfsprod….app.visualstudio.com/" Content-Length: 0
同じ日にほかに見たこと:
remote:の行も TF の番号もありません。TF401019(アカウントから見えないリポジトリ)や TF402455(守られたブランチ)と違い、文からは理由を見分けられません。- 存在しない組織では別の文になります:
fatal: repository '…' not found(HTTP 404)。トークンがあってもなくても同じです。「Authentication failed」なら、組織はあります。 - 公開リポジトリは聞かずに読めます。URL にでたらめなトークンを入れても、
git ls-remoteは公開リポジトリのブランチを並べました。git はサーバーに求められたときだけパスワードを送るからです。 - 資格情報がまったく無いと、git はユーザー名を聞いてきます。聞けないスクリプトの中では
fatal: could not read Username for '…': terminal prompts disabled(「ユーザー名を読めない:端末での入力が切られている」)になります。
Azure DevOps がトークンを断る理由
Microsoft の Use personal access tokens(2026年9月21日更新)は、「PAT が効かなくなったのはなぜ?」にこう答えています。
- 期限が切れた。Azure DevOps は期限の前に知らせを送ります。切れた PAT は作り直せない(regenerate できない)ので、新しく作ります。
- 取り消された:自分で、管理者が、または Azure DevOps 自身が。Azure DevOps は公開の GitHub リポジトリから漏れた PAT を探しており、見つけるとテナントの方針で切っていない限り取り消します。
- 無効になった。Microsoft Entra ID につながった組織では、Microsoft は「新しい PAT で90日以内にサインインしないと無効になる」と書いています。条件付きアクセスがもっと頻繁なサインインを求めることもあります。ブラウザーで Azure DevOps にサインインし、最後まで済ませてから、もう一度試します。
- 権限が足りない。git には Code の権限が要ります。クローンと取得は Read、プッシュは Read & write です。
- ユーザーの立場が変わった。アカウントが無効にされたか組織から外されると、その PAT はその組織に届かなくなります。戻されれば、期限内で取り消されていない PAT はまた使えます。
git からは同じに見えるものがあと2つあります。PAT は1つの組織用に作るもので、組織はリモートの URL の dev.azure.com/ のすぐ後の部分です(git remote -v で見られます)。そして「All accessible organizations」(すべての組織)用の PAT は廃止に向かっています(廃止と、延期された日付)。Azure DevOps Server について、Microsoft は IIS の基本認証が PAT での認証を妨げるので切ったままにするよう書いています。
どれかを見分ける
- 自分のトークンの一覧。Azure DevOps の User settings › Personal access tokens に、PAT ごとの状態・組織・権限・期限が出ます。
git: https://dev.azure.com/<組織> on <パソコン>という名前の PAT は、git が最初につないだときに Git Credential Manager が作ったものです。 - 監査ログ(組織の管理者):Organization settings › Auditing で、
Token.PatExpiredEvent(期限切れ)・Token.PatRevokeEvent(取り消し)・Token.PatSystemRevokeEvent(Azure DevOps による取り消し)・Token.PatPublicDiscoveryEvent(公開リポジトリで見つかった)に絞ります。Microsoft は監査の記録を90日で消し、PAT がいつ使われたかは記録しません。 - アカウント。同じアカウントでリポジトリをブラウザーで開きます。先にサインインを求められるなら、TF401444 を見てください。
git が古いトークンを送り続けるとき
- 401 の後、git は資格情報ヘルパーにそのパスワードを忘れさせ、もう一度聞きます。IntelliJ IDEA と Rider では IDE のログインの窓で、コマンドラインでは資格情報ヘルパーか端末で聞きます。パスワードの欄に新しい PAT を入れます。Microsoft によれば、ユーザー名は空でかまいません。
- 古い PAT がリモートの URL そのものに書いてあると、git はそれを使い続けます。Microsoft はリモートの URL に PAT を入れないよう勧めています。PAT の無い URL にし(
git remote set-url origin https://dev.azure.com/<組織>/<プロジェクト>/_git/<リポジトリ>)、トークンは資格情報ヘルパーに持たせます。 - Git Credential Manager 3.0 は、ブラウザーで Microsoft のアカウントにサインインし、PAT ではなく OAuth のトークンを持ちます。違うアカウントでサインインしてしまうときや、「Authentication using the new GCM Entra application failed」(「新しい GCM の Entra アプリでの認証に失敗した」)と出るときは、Git Credential Manager 3.0 と Azure Repos を見てください(
git credential-manager azure-repos listとunbind、古いアプリで1回だけやり直す方法)。 - SSH の git は PAT を使いません(SSH で代わりに起きること)。
IntelliJ IDEA・Rider で Azure DevOps のプルリクを見るなら
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。REST API には、git とは別に IDE のパスワード保管庫に置いた自分の個人用アクセス トークンか、Azure CLI でサインインします。Azure DevOps がトークンを断ると、そう伝え、よくある理由(期限切れ・Code の権限が無い・「All accessible organizations」用)を示します。受信箱は無料、投票・コメント・完了は Pro(月 US$1・30日間の無料試用つき)です。画面は日本語です。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「VS30063: You are not authorized to access https://dev.azure.com」(.NET の道具での同じ拒否) · 「TF400813: The user … is not authorized」 · English