Azure Artifacts:npm の「E401 Unable to authenticate, need: Bearer authorization_uri=…」
npm が、フィードの受け付ける資格情報なしに Azure Artifacts のフィードへパッケージを求めると、フィードは 401 を返し、受け付ける方法を並べます。Bearer のトークン、個人用アクセス トークンでの Basic、TFS-Federated です。npm はその一覧をそのまま出します。フィードが落ちているという意味ではほぼなく、npm がそのアドレスに使える資格情報を何も送らなかったという意味です(このメッセージの Stack Overflow の質問は17万回以上見られています)。
プルリクエストのビルド検証で npm install が失敗しているなら、プルリクエストはそれを待っています:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、プルリクエストのブランチ ポリシーを状態つきで IDE に並べ、Pro ならフィードがビルドを通すようになったあとに、失敗したビルド ポリシーをもう一度動かせます。JetBrains Marketplace で入れる
どう見えるか
npm ERR! code E401のあとにnpm ERR! Unable to authenticate, need: Bearer authorization_uri=https://login.windows.net/<テナント>, Basic realm="https://pkgsprodcus1.pkgs.visualstudio.com/", TFS-Federated。realm はリージョンで変わります。新しい npm はnpm ERR!ではなくnpm errorと書きます。- 別の形:
Unable to authenticate, your authentication token seems to be invalid.npm はトークンを送っていて、フィードがそれを断ったということです。
npm は資格情報をアドレスで照らし合わせる
- プロジェクトの
.npmrcにはregistry=の行があります。資格情報は、同じアドレスからhttps:を除いたもので始まる行に書きます。たとえば//pkgs.dev.azure.com/fabrikam/_packaging/shared/npm/registry/:_password=で、npm はそのアドレスへの要求にだけそれを使います。Microsoft のひな形には2組あり、1組は/npm/registry/、もう1組は/npm/で終わります(npm の設定についての Microsoft のページ)。 - 同じフィードは古いアドレス
https://fabrikam.pkgs.visualstudio.com/_packaging/shared/npm/registry/でも答えます。registry の行が片方のアドレスで、資格情報がもう片方だと照らし合わず、npm は何も送りません(一番読まれている質問への回答)。リポジトリとホーム フォルダーのすべての.npmrcを見て、アドレスを1つにそろえます。別の回答は、いくつものファイルに両方が混ざっていたのを見つけています。 - プロジェクト スコープのフィードはアドレスにプロジェクトが入り(
/fabrikam/Web/_packaging/shared/)、資格情報の行にも要ります。 - 資格情報はユーザーの
.npmrc(ホーム フォルダー)に置き、コミットするプロジェクトの.npmrcにはregistry=の行だけを置きます。Microsoft の手順もこの形です。
Windows:vsts-npm-auth
vsts-npm-auth -config .npmrcは、プロジェクトの.npmrcからレジストリを読み、ユーザーの.npmrcにトークンを書きます。Microsoft は、トークンには期限があり、切れると npm が 401 を受け取り、コマンドをもう一度動かせば直ると書いています。- サインインを求めずにすぐ終わるなら、すでに持っているトークンを使い続けていて、それが悪いものかもしれません(たとえばパスワードを変えたあと)。
vsts-npm-auth -config .npmrc -forceで新しく取り直します。一番読まれている質問で一番票を集めた回答で、200票を超えています。 - vsts-npm-auth は Azure DevOps Server では動きません。そこでは下の個人用アクセス トークンを使います。
macOS・Linux、または vsts-npm-auth なしで:個人用アクセス トークン
- Packaging の Read & write のスコープを持つ個人用アクセス トークンを作ります。ユーザーの
.npmrcで、2つのアドレスの形のそれぞれについて、:username=に空でない何かの値、:_password=に base64 にしたトークン、:email=に何かを書きます。email は npm が求めるだけで使いません(Microsoft の npm の設定のページ)。 - npm は
_passwordを base64 から戻して使うので、トークンをそのまま貼ると、フィードには崩れた値が届いて断られます。末尾に改行を付けずに変換します(echoではなくecho -n "token" | base64)。トークンの期限が切れると同じ 401 が戻ってくるので、作り直してもう一度変換します。
パイプラインでは:npm install の前に npmAuthenticate
npm ci・npm install・npm publishの前に、workingFile:にプロジェクトの.npmrc(フォルダーではなくファイル)を指定した- task: npmAuthenticate@0を足します。このタスクはそのファイルからレジストリを見つけ、その末尾に資格情報を書き足します。組織の中のフィードにはビルド自身の資格情報、ほかのレジストリにはcustomEndpointに書いた npm のサービス接続の資格情報です(タスクのリファレンス)。ファイルは実行の終わりに元に戻ります。- 一度に資格情報を書き足せる
.npmrcは1つです。プロジェクトが複数あるなら、ファイルごとに動かすか、リファレンスにあるとおり、$(Agent.TempDirectory)の.npmrcを1つ認証してNPM_CONFIG_USERCONFIGをそれに向けます。 - タスクを置いても E401 や 403 のままなら、ビルド ID がフィードのロールを持っていないか、Limit job authorization scope が入っていてフィードが別のプロジェクトにあります。ロールもその設定も NuGet と同じです:Unable to load the service index for source。npmjs のようなアップストリームを通って来るパッケージは、最初の1回に Feed and Upstream Reader (Collaborator) が要ります。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、JetBrains IDE 2024.1 以降と Android Studio で動く Lesstep のプラグインです。git のリモートから組織・プロジェクト・リポジトリを読み、あなたのレビュー待ちのプルリクエストを IDE のツール ウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも動きます。プルリクエストのブランチ ポリシーを状態つきで見せるので、通っていない必須のビルドがプルリクエストの隣に出ます。Pro なら、失敗したビルド ポリシーや期限の切れたビルド ポリシーをそこからもう一度動かせます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日の無料試用つき)。
Azure DevOps・Azure Artifacts・Azure Pipelines は Microsoft Corporation の商標、npm は npm, Inc. の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページはそのいずれとも提携しておらず、承認も受けていません。
ほかに:pip:401 Error, Credentials not correct for · NuGet:Unable to load the service index for source · チェックアウトが Git fetch failed with exit code: 128 で止まる · VS800075:ビルド サービスがプロジェクトを見られない · English