Codex 401 Unauthorized エラーの原因と認証の直し方
Codex CLI でコマンドを実行した瞬間に「401 Unauthorized」が返って止まることがある。これは Codex の障害ではなく、サインイン情報や API キーが正しく渡っていないときに OpenAI が返す認証エラーだ。CLI の更新後に再サインインが必要になったり、環境変数が競合したりすると発生しやすい。本記事では 401 の原因を切り分け、認証を正しい状態へ戻す手順を公式情報に沿って整理する(出典: https://github.com/openai/codex)。
401 Unauthorized は、Codex に渡された認証情報が無効なときに返るエラーだ。OpenAI はこのコードを「Invalid Authentication(認証が無効)」と定義しており、対処として 正しい API キーと、リクエスト元の組織が使われていることを確認するよう案内している。Codex CLI・IDE 拡張・アプリのいずれを使っていても、認証情報が通らなければ同じ 401 が返る点は共通している(出典: https://developers.openai.com/api/docs/guides/error-codes)。
実務でいちばん多い原因は、環境変数 OPENAI_API_KEY がサインイン情報を上書きしているケースだ。プロジェクトの .env やシェルの設定から OPENAI_API_KEY が読み込まれていると、ブラウザで ChatGPT サインインを済ませていても Codex はその環境変数を優先してしまい、キーが失効・誤りであれば 401 になる。この場合は OPENAI_API_KEY を一時的に外してから Codex を起動するだけで解決することが多い(出典: https://github.com/openai/codex/issues/15151)。
直し方の基本は、まず codex login status で現在の認証モードを確認し、状態がおかしければ codex logout でいったん資格情報を消してから codex login で入れ直すことだ。ヘッドレスのサーバーや VM では codex login --device-auth を使う。~/.codex/auth.json はパスワードと同じ機密情報として扱い、共有や公開をしないことが前提になる(出典: https://developers.openai.com/codex/auth)。
目次 (15)
- 401 Unauthorized は Codex の認証情報が無効なときに出るエラー
- 401 が出る主な原因
- 環境変数 OPENAI_API_KEY がサインインを上書きしている
- API キーが失効・誤り・権限不足になっている
- 認証ファイル auth.json が更新されていない
- サインインセッションの期限切れ
- 認証状態を確認する手順
- 401 を解決する手順
- Step 1: 環境変数の競合を解消する
- Step 2: サインインし直す
- Step 3: ヘッドレス環境ではデバイス認証を使う
- Step 4: API キーと組織・権限を見直す
- 401 を再発させないための運用
- まとめ — 401 は「認証情報が通っていない」と捉えれば切り分けられる
- 出典
401 Unauthorized は Codex の認証情報が無効なときに出るエラー
401 は HTTP のステータスコードのひとつで、リクエスト元が誰なのかを認証できなかったことを示す。OpenAI の公式エラーコード一覧では、401 を「Invalid Authentication(認証が無効)」と定義し、原因として「認証資格情報が無効である」、解決策として「正しい API キーと、リクエストを送っている組織が使われていることを確認する」と明記している。さらに「Incorrect API key provided(API キーが正しくない)」という派生ケースもあり、こちらは「キーが正しいか確認する、ブラウザのキャッシュをクリアする、新しいキーを生成する」よう案内されている。つまり 401 は Codex 本体の不具合ではなく、Codex に渡された認証情報が OpenAI 側で受理されなかったときに返る正常系のエラーだ。Codex CLI でも IDE 拡張でも Codex アプリでも、認証が通らなければ同じ 401 が返るため、まず「どの認証手段が、どの資格情報で動いているか」を確認するのが切り分けの出発点になる(出典: https://developers.openai.com/api/docs/guides/error-codes)。
Codex のサインイン手段は大きく二つある。ひとつは ChatGPT アカウントでのサインインで、CLI で有効なセッションがないときの既定の経路だ。もうひとつは OpenAI ダッシュボードで発行した API キーによるサインインで、標準の API 料金が適用され、スクリプトから無人で動かす CI/CD 用途で推奨されている。どちらの手段でも、最終的に Codex は資格情報を ~/.codex/auth.json にキャッシュして使う。401 が出たときは、この「どちらの手段で、何が auth.json に入っているか」と「OpenAI 側がそれを受理するか」のズレを疑うことになる(出典: https://developers.openai.com/codex/auth)。
401 が出る主な原因
Codex で 401 が発生する原因は、いくつかの典型パターンに分類できる。原因ごとに対処が異なるため、まずどのパターンに当てはまるかを見極めることが、復旧までの近道になる。以下では、報告件数が多い順に四つの原因を整理する。いずれも Codex 側の故障ではなく、認証情報の渡し方・状態に起因するものだ。順番に確認していけば、ほとんどのケースで原因を 1 つに絞り込める。なお、複数の原因が同時に重なっていることもあるため、一つ対処して解決しなければ次の項目に進む形で切り分けるとよい。
環境変数 OPENAI_API_KEY がサインインを上書きしている
実務でもっとも多いのがこのパターンだ。Codex CLI は環境変数 OPENAI_API_KEY が設定されていると、ブラウザで ChatGPT サインインを済ませていても、その環境変数のキーを優先して使う。問題は、OPENAI_API_KEY がプロジェクト直下の .env ファイルやシェルの設定(.bashrc / .zshrc など)から知らないうちに読み込まれていることがある点だ。読み込まれたキーが失効・誤り・別組織のものだと、サインイン自体は成功しているのに 401 が返り、原因が分かりにくくなる。GitHub の Issue でも「環境変数が静かにサインイン情報を上書きして、紛らわしい 401 を引き起こす」と報告されている(出典: https://github.com/openai/codex/issues/15151)。
API キーが失効・誤り・権限不足になっている
API キーでサインインしている場合は、キーそのものの問題を疑う。ダッシュボードでキーを失効(revoke)させた、別のキーをコピーしてしまった、キー文字列に余計な空白や改行が混ざっている、といった単純な誤りが 401 の典型だ。加えて、組織やプロジェクトでの権限不足も 401 の原因になる。OpenAI 公式は「正しい組織・プロジェクトのロールを持っているか」「権限を制限したキー(restricted key)の場合は必要なスコープがあるか」を確認するよう案内している。アカウントがどの組織にも所属していないと「You must be a member of an organization to use the API」という 401 が返るため、組織への招待状況も確認対象になる(出典: https://developers.openai.com/api/docs/guides/error-codes)。
認証ファイル auth.json が更新されていない
サインイン操作は成功したように見えるのに、資格情報のキャッシュ ~/.codex/auth.json が実際には更新されておらず、古い情報のまま 401 になるケースがある。とくにヘッドレスの Linux サーバーや VM で、ブラウザを開けない環境のまま通常のサインインを試したときに起きやすい。GitHub の Issue でも「codex login を実行しても auth.json が更新されず、有効なキーがあるのに Linux VM で 401 が出続ける」という報告が上がっている。この場合はファイルの状態を直接確認し、必要なら削除してサインインし直すか、後述するデバイス認証に切り替える(出典: https://github.com/openai/codex/issues/20871)。
サインインセッションの期限切れ
ChatGPT サインインで使われるアクセストークンには有効期限がある。公式ドキュメントによれば、作業中はトークンが期限切れ前に自動で更新される設計だが、長期間 Codex を使っていなかったり、別のマシンからサインインし直したりすると、手元のセッションが古くなって 401 になることがある。ブラウザ版の Codex は動くのに CLI やデスクトップだけが 401 を返す、という状態はこのパターンに当てはまりやすい。トークンの問題が疑われるときは、再サインインで新しいセッションを取得するのが確実な対処になる(出典: https://developers.openai.com/codex/auth)。
認証状態を確認する手順
原因を絞り込むには、いきなり再サインインを試す前に、いまの認証状態を可視化するのが効率的だ。Codex CLI には認証状態を確認するための専用サブコマンドが用意されており、これと環境変数・資格情報ファイルの確認を組み合わせると、四つの原因のどれに当たっているかをかなり正確に判定できる。以下の手順を順番に実行し、それぞれの結果をメモしておくと、対処後に状態が変わったかどうかも比較しやすくなる。確認は数十秒で終わるので、闇雲に再サインインを繰り返すより先にここを通すほうが結果的に早い。
codex login statusを実行し、現在アクティブな認証モード(ChatGPT サインインか API キーか)を確認する。資格情報があれば終了コード 0 を返すため、無人実行のスクリプトでの判定にも使える。- シェルで
printenv OPENAI_API_KEYを実行し、環境変数が設定されていないかを確認する。値が表示される場合は、その出どころ(.envやシェル設定)を特定する。 ~/.codex/auth.jsonが存在するか、更新日時が最近かを確認する。サインインしたはずなのに古いままなら、auth.json の未更新を疑う。
codex login status の表示と、環境変数の有無を突き合わせるだけで、「ブラウザでサインインしたのに環境変数のキーが優先されている」という最頻ケースかどうかはすぐ判別できる。表示された認証モードが意図したものと違っていれば、原因はほぼ環境変数の競合だ(出典: https://developers.openai.com/codex/cli/reference)。
401 を解決する手順
原因の見当がついたら、対応する対処を実行する。下記の Step は、報告の多い順かつ影響範囲の小さい順に並べてある。最初の Step で解決すれば、それ以降は実施不要だ。逆に、ひとつ試して解決しなければ次の Step へ進む形で進めれば、設定を必要以上にいじらずに最小の変更で復旧できる。各手順は Codex 公式ドキュメントで案内されている操作に基づいている。
Step 1: 環境変数の競合を解消する
最初に疑うべきは環境変数 OPENAI_API_KEY の競合だ。ChatGPT サインインで使いたいのに環境変数のキーが優先されている場合は、その環境変数を外してから Codex を起動する。
# 一時的に環境変数を外して Codex を起動する
unset OPENAI_API_KEY
codex
毎回外すのが面倒な場合は、シェルにエイリアスを定義しておくと、起動のたびに自動で OPENAI_API_KEY を無効化できる。
# .bashrc / .zshrc に追記する例
alias codex='unset OPENAI_API_KEY && command codex'
OPENAI_API_KEY がプロジェクトの .env から読み込まれている場合は、その行を削除するかリネームすれば 401 が解消することが報告されている。なお、API キーで使うことを意図しているなら環境変数を外す必要はなく、その場合は Step 4 でキー自体を見直す(出典: https://github.com/openai/codex/issues/15151)。
Step 2: サインインし直す
環境変数の問題でなければ、資格情報をいったん消してサインインし直す。セッションの期限切れや auth.json の不整合は、これで解消することが多い。
# 資格情報を消してからサインインし直す
codex logout
codex login
codex logout はキャッシュされた資格情報を削除し、codex login は ChatGPT アカウント・API キー・アクセストークンのいずれかで認証し直すサブコマンドだ。サインイン後にもう一度 codex login status を実行し、意図した認証モードになっているかを確認する。これで新しいトークンが取得され、期限切れに起因する 401 は解消する(出典: https://developers.openai.com/codex/cli/reference)。
Step 3: ヘッドレス環境ではデバイス認証を使う
ブラウザを開けないサーバーや VM では、通常のサインインだと auth.json がうまく更新されず 401 が続くことがある。この場合はデバイス認証を使う。
# デバイスコードでサインインする
codex login --device-auth
デバイス認証は、表示されたコードを別の端末のブラウザで入力して認証を完了する方式で、ヘッドレス環境での推奨手段だ。それでも難しい場合は、認証済みのマシンの ~/.codex/auth.json を対象環境へコピーする、あるいは対象環境の localhost:1455 へ SSH ポートフォワーディングしてサインインを通す、といった回避策が公式に案内されている(出典: https://developers.openai.com/codex/auth)。
Step 4: API キーと組織・権限を見直す
API キーでサインインしているのに 401 が続く場合は、キーと組織まわりを点検する。ダッシュボードでキーが失効していないか、別のキーと取り違えていないか、コピー時に余計な空白や改行が混ざっていないかを確認する。問題があれば新しいキーを生成して入れ直すのが確実だ。あわせて、正しい組織・プロジェクトのロールを持っているか、権限を制限したキーなら必要なスコープがあるかも確認する。アカウントが組織に所属していない場合は、組織の管理者に招待を依頼する必要がある(出典: https://developers.openai.com/api/docs/guides/error-codes)。
401 を再発させないための運用
401 はその場で直せても、原因を残したままだと再発する。とくに環境変数の競合は、複数のプロジェクトを行き来していると繰り返し踏みやすい。意図する認証手段を最初に決め、それに合わせて環境を整えておくと、401 に振り回される頻度を大きく下げられる。日常的に Codex を使うなら、サインインで使うのか API キーで使うのかをはっきりさせ、両方の資格情報が中途半端に混在しないようにしておくのが基本方針になる。Codex CLI は更新が続いているため、更新直後に挙動を一度確認しておくと、思わぬ 401 を早期に発見できる。
API キーで運用する場合は、~/.codex/auth.json をパスワードと同じ機密情報として扱う。リポジトリにコミットしたり、チャットやチケットに貼り付けたりしないことはもちろん、共有マシンでは資格情報の保存先にも注意する。Codex は資格情報の保存方式を設定で選べるようになっており、ファイルで保存するか OS の資格情報ストアを使うかを cli_auth_credentials_store で指定できる。組織として認証手段を統一したい場合は、サインイン方法を制限する設定(forced_login_method)を使うと、メンバー間で「人によって ChatGPT サインインだったり API キーだったり」というブレを防げる(出典: https://developers.openai.com/codex/auth)。
CI/CD のように無人で Codex を動かす環境では、ChatGPT サインインよりも API キー、またはアクセストークンを使う構成が向いている。アクセストークンは printenv CODEX_ACCESS_TOKEN | codex login --with-access-token のように標準入力経由で渡せるため、対話的なブラウザサインインを挟まずに認証できる。無人実行で 401 が出たときは、codex login status の終了コードを使って事前に資格情報の有無を判定し、足りなければサインイン手順に分岐させると、原因不明のまま処理が止まる事態を避けられる(出典: https://developers.openai.com/codex/auth)。
まとめ — 401 は「認証情報が通っていない」と捉えれば切り分けられる
Codex で 401 Unauthorized が出るのは、渡した認証情報が OpenAI 側で受理されなかったときだ。原因は、(1) 環境変数 OPENAI_API_KEY がサインインを上書きしている、(2) API キーが失効・誤り・権限不足、(3) auth.json が更新されていない、(4) サインインセッションの期限切れ、の四つに整理できる。まず codex login status と環境変数の有無で状態を確認し、もっとも多い環境変数の競合から順に対処していくのが効率的だ。
復旧の柱は、環境変数を外して起動する、codex logout と codex login で資格情報を入れ直す、ヘッドレスではデバイス認証を使う、API キーと組織・権限を見直す、という四つの操作になる。普段から認証手段を一本化し、auth.json をパスワードと同じ機密として扱っておけば、401 の再発自体も抑えられる。
出典
- Error codes(OpenAI API ドキュメント)
- Authentication – Codex(OpenAI Developers)
- Command line options – Codex CLI(OpenAI Developers)
- 環境変数 OPENAI_API_KEY がサインイン情報を上書きして紛らわしい 401 を引き起こす不具合(openai/codex Issue #15151)
- Codex CLI permanently fails with 401 on Linux VMs despite valid API key(openai/codex Issue #20871)