Jenkins の「401 Unauthorized」と「Invalid password/token for user」
ユーザー ID と API トークンは Jenkins に届いていて、Jenkins がその組を受け付けませんでした。名前が Jenkins のユーザー ID ではないか、トークンがそのユーザーのトークンではないかのどちらかです。権限の話はまだです:権限は Jenkins が誰かを分かってからの話です。
Jenkins の答え
手元の Jenkins 2.580.1(ログイン必須の設定)で、2026年10月28日に。実在のユーザー ID と違うトークンで REST API を呼んだとき:
curl -i -u 'tester:11abcdef0123456789abcdef0123456789' 'https://jenkins.example.com/api/json' HTTP 401 Unauthorized WWW-Authenticate: Basic realm="Jenkins", charset="UTF-8"
本文は Jetty のエラーページ「HTTP ERROR 401 Unauthorized」で、MESSAGE: Unauthorized。存在しないユーザー ID でも、ユーザー ID の代わりにメールアドレスを入れても、ビルドを始める POST でも同じ答えでした。
この場面の Jenkins 自身の文は Invalid password/token for user: <受け取ったユーザー ID> です(Jenkins のソースの BasicHeaderProcessor)。この文が見えるかは版とクライアントによります。Jenkins 2.580.1 が返したのは「Unauthorized」だけでした。
同じ違うトークンで Jenkins CLI を、WebSocket(既定)と -http で:
java -jar jenkins-cli.jar -s https://jenkins.example.com/ -auth tester:<違うトークン> who-am-i io.jenkins.cli.shaded.jakarta.websocket.DeploymentException: Handshake error. Caused by: java.lang.NullPointerException: Cannot invoke "...UpgradeRequest.getRequestURI()" because "upgradeRequest" is null java -jar jenkins-cli.jar -s https://jenkins.example.com/ -http -auth tester:<違うトークン> who-am-i java.io.IOException: Server returned HTTP response code: 401 for URL: https://jenkins.example.com/cli?remoting=false
つまり CLI の「Handshake error.」は、トークンの間違いだけのこともあります。同じコマンドを -http 付きで走らせると 401 が見えます。
Jenkins が組を受け付けなかった理由
- 名前がユーザー ID ではない。Jenkins が求めるのはユーザー ID で、氏名やメールアドレスではありません。ユーザーのページのアドレスの最後の部分(
/user/<id>/)です。LDAP・Active Directory・シングルサインオンでは、セキュリティの設定(レルム)が Jenkins に渡す ID で、ログイン画面で打つ物と違うことがあります。 - トークンがそのユーザーのトークンではない。API トークンは1つの Jenkins の1人のユーザーの物です。取り消したトークン、同僚が作ったトークン、別の Jenkins(試験用のサーバーなど)で作ったトークンは 401 になります。写すときに途中で切れたトークンも同じです。新しいトークンは一度しか表示されないので、手元に無ければ作り直します。
- 401 ではなく 403 と「anonymous」なら、ユーザー ID とトークンは Jenkins に届いていません:「anonymous is missing the Overall/Read permission」。API トークンを
Authorization: Bearerで送るのもその一つで、Jenkins 2.580.1 は anonymous として 403 で答えました。
1回のリクエストで組を確かめる
curl -i -u 'your-user-id:your-api-token' 'https://jenkins.example.com/whoAmI/api/json'
200 で "name" が自分のユーザー ID なら組は正しく、原因は別にあります。401 なら Jenkins が組を断っています。-u なしだと同じアドレスが 200 と "name":"anonymous" を返したので、資格情報がそもそも届いているかも分かります。
新しいトークンの作り方:自分のユーザーのページ(右上の自分の名前)→ Security → API Token → Add new Token。
IntelliJ IDEA など JetBrains IDE で Jenkins のビルドを見るなら
Pipeline Inbox for Jenkins は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Jenkins のサーバーごとのユーザー ID と API トークンを設定の「ツール」の「Pipeline Inbox for Jenkins」に置き、両方の前後の空白を落として、すべてのリクエストに付けて送ります。Jenkins が 401 で答えると「<サーバー> がユーザー名か API トークンを受け付けませんでした。設定の「ツール」の「Pipeline Inbox for Jenkins」で両方を確かめてください(ユーザー名は Jenkins のユーザー ID です)。」と出します。ビルドの一覧・Pipeline の段・失敗したテスト・コンソールのログは無料、パラメーター付きのビルド・再ビルド・中止・入力ステップは Pro(月 US$1.50・30日間の試用つき)です。
Jenkins® は LF Charities Inc. の登録商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Jenkins プロジェクト・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「anonymous is missing the Overall/Read permission」 · IntelliJ IDEA で使える Jenkins のプラグインの比較 · English