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つのどれかです。
- Token is expired. You can either do re-authorization or token refresh.:期限の日を過ぎた。
- Token was revoked. You have to re-authorize from the user.:誰かが取り消したか、ローテーションされた(自社のサーバーでの公開の報告)。
- Token is an impersonation token but impersonation was disabled.:管理者がなりすまし(impersonation)を止めた。
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 の個人アクセストークンの説明より:
- 個人・グループ・プロジェクト・なりすましのアクセストークンは、期限の日の UTC の午前0時(日本時間の午前9時)に切れます。切れたトークンは元に戻せないので、新しいトークンを作ります。
- 期限の日を入れずに作ると、作った日から365日後が期限になります。既定では、期限は365日より先にできません。なので、日付を入れずに作ったトークンは1年で止まります。GitLab 17.6 以降は、管理者がこの上限を変えられます。
- 個人アクセストークンが切れる7日前に、GitLab はメールで知らせます。GitLab 17.6 以降は30日前と60日前にも。同じページに、トークンの期限の日を載せた iCalendar のフィードもあります。
取り消し
- Personal access tokens の画面の Revoke で、トークンはすぐに止まります。管理者も取り消せます。
- Rotate(ローテーション)は、同じ権限とスコープの新しいトークンを作り、元のトークンはすぐに使えなくなります。元のトークンを使っている道具は、新しいトークンを入れるまで動きません。なので、自分か同僚かスクリプトがローテーションしたトークンは、まだ入っている所すべてで「Token was revoked」になります。
- API で、すでに取り消されたトークンをローテーションしようとすると、同じ系統(family)の有効なトークンがすべて取り消されます(GitLab の再利用の検出)。もう持っていないトークンをローテーションするスクリプトは、新しいトークンまで止めてしまいます。
新しいトークンを作る
- GitLab の右上の自分のアイコン → Edit profile → 左の Access > Personal access tokens(2026年10月24日の GitLab の説明での名前。古い版では違います)。Generate token の一覧から Legacy token を選ぶ。
- 名前・期限(既定では365日先まで)・前と同じスコープを入れる。入力済みの画面を開くこともできます。例:
https://gitlab.com/-/user_settings/personal_access_tokens?name=IDE&scopes=api(入力済みで開く方法。Self-Managed ならそのサーバーの住所で)。 - トークンをコピーする。GitLab が見せるのは、その画面を離れるか読み直すまでです。
- 古いトークンを入れていた所すべてに入れる。
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)では:
- 「Login failed. Check your API token or GitLab version.」(ログインに失敗。API トークンか GitLab の版を確かめて)は、どちらも答えないとき、理由を問わず出ます。期限切れ・取り消し・知らないトークン(上の 401)はここに来ますが、最初の問い合わせのほかの失敗も、IntelliJ IDEA が同じように受け止めるのでここに来ます:GitLab でないサーバーの住所や、間に入ったプロキシなど。文はどれなのかを言いません。上の
curlを同じサーバーの住所とトークンで打つと、GitLab 自身の答えが見えます。IntelliJ IDEA はサーバーの版を IDE を再起動するまで覚えているので、この起動のあいだに一度読めていれば、受け付けられないトークンは一歩あと(ユーザーを読むところ)で別の文になって止まります。 - IntelliJ IDEA が Git でのログインに切り替えられるときは、続けて「For GitLab verisons older than 14.0, log in using Git.」と出ます(綴りの誤りは IntelliJ IDEA のまま)。そのリンクで Git でログインします。
- 「Login failed. GitLab versions older than 14.0 are not supported.」(14.0 より古い GitLab には対応しない)は、版を読めて 14.0 より古いとき。
- トークンでのログインの、新しいトークンを作るリンクは、GitLab の Personal access tokens のページをスコープ
apiとread_userを入れた状態で開きます。 - 「Token missing or expired, log in again」(トークンが無いか期限切れ。ログインし直して)は Share Project on GitLab の画面で、そのアカウントのトークンが保存されていないとき、またはアカウントのグループを読んで HTTP 401 が返ったときに出ます。リンクでログインをやり直せます(IntelliJ IDEA:GitLabShareProjectDialogViewModel.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