Lesstep
GitLab.com・Self-Managed・アクセストークン・2026年10月24日に確認

GitLab の 401「invalid_token」「Token is expired」「Token was revoked」

GitLab はトークンを知っていますが、もう受け付けない、という意味です。期限が切れたか、取り消されています。GitLab は HTTP 401 で断り、どちらかを error_description に書いています。期限が切れたトークンは元に戻せないので、新しいトークンを作り、古いトークンを入れていた所に入れます。権限(スコープ)が足りないとき(403 の insufficient_scope)とは違い、スコープを変えても直りません。

答えの全体

GitLab が組み立てる形です(lib/api/api_guard.rb)。期限が切れたトークンなら:

HTTP 401
WWW-Authenticate: Bearer realm="Protected by OAuth 2.0", error="invalid_token",
  error_description="Token is expired. You can either do re-authorization or token refresh."

{"error": "invalid_token",
 "error_description": "Token is expired. You can either do re-authorization or token refresh."}

同じ答えが公開の報告にもあります(2026年のパッケージのアップロード)。error_description は次の3つのどれかです。

GitLab がまったく知らないトークン(打ち間違い、貼り付けで切れた、別の GitLab のサーバーで作った)には、もっと素っ気ない 401 が返ります:{"message": "401 Unauthorized"}(lib/api/helpers.rb)。どちらの答えかを見るには、curl で呼びます。

curl -i --header "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/user"

期限切れ

GitLab の個人アクセストークンの説明より:

取り消し

新しいトークンを作る

  1. GitLab の右上の自分のアイコン → Edit profile → 左の Access > Personal access tokens(2026年10月24日の GitLab の説明での名前。古い版では違います)。Generate token の一覧から Legacy token を選ぶ。
  2. 名前・期限(既定では365日先まで)・前と同じスコープを入れる。入力済みの画面を開くこともできます。例:https://gitlab.com/-/user_settings/personal_access_tokens?name=IDE&scopes=api(入力済みで開く方法。Self-Managed ならそのサーバーの住所で)。
  3. トークンをコピーする。GitLab が見せるのは、その画面を離れるか読み直すまでです。
  4. 古いトークンを入れていた所すべてに入れる。

IntelliJ IDEA の「Login failed. Check your API token or GitLab version.」

IntelliJ IDEA に入っている GitLab の機能にトークンでログインすると、まずそのトークンでサーバーの版を読みます:GraphQL の metadata を問い合わせ、だめなら REST の /version を読みます(GitLab の説明「Metadata API」)。どちらも GitLab が受け付けるトークンが要ります。ソース(2026年10月30日に確認・IntelliJ IDEA:GitLabTokenLoginPanelModel.kt・GitLabSecurityUtil.kt・GitLabServersManager.kt・GitLabApi.kt・GitLabLoginErrorStatusPresenter.kt)では:

IntelliJ IDEA で GitLab の MR とパイプラインを見るなら

Lesstep は、JetBrains IDE(2024.1 以降)のプラグインを2つ作っています。Merge Request Inbox for GitLab と Pipeline Inbox for GitLab CI です。どちらも GitLab を read_api で読み、api で変えます。読んでいるときに GitLab が 401 でトークンを断ると、トークンが期限切れか、取り消されたか、別の GitLab のものだと言い、GitLab の説明の文をそのまま出し、設定を開けるようにします。設定には、名前と権限を入力済みで GitLab の作成の画面を開くリンクがあります(GitLab 16.7 以降)。トークンは IDE のパスワード保管庫に入っているので、直すのはそこだけです。読むのは無料、承認・コメント・マージや、パイプラインの再実行・取り消し・実行は Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。

GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:GitLab の「insufficient_scope」 · GitLab の 404「Project Not Found」 · GitLab のマージの断り(405・409・422) · GitLab の承認の断り(401・409) · GitLab のコメント・スレッドの断り(400・403) · GitLab のマージリクエストが作れない(409・422・400) · GitLab のリベースの断り・失敗(403・409) · GitLab の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · JetBrains の IDE で GitLab のパイプラインを扱う · English