背景
auto_validate_request: true を有効化したとき、actingAs() / auth middleware bypass で認証している test が「security requirement not satisfied」で大量失敗する。現状の auto_inject_dummy_bearer は bearer scheme のみ を対象としているため、cookie / apiKey-in-header 系 security scheme はカバーできない。
現状
studio-design/studio-api PR #6617 のフォローで auto_validate_request: true を試したところ、3994 tests 中 250+ 件が以下のような失敗を出した:
[security] PATCH /v2/organizations/{organization_id}: requirement 'CookieAuth' not satisfied: api key 'front_session' is missing from the cookie.
[security] POST /v2/admin/clients: requirement 'CookieAuth' not satisfied: api key 'admin_session' is missing from the cookie.
[security] DELETE /v2/admin/end_support: requirement 'JwtToken' not satisfied: api key 'Authorization' is missing from the header.
これら spec 上は CookieAuth (type: apiKey, in: cookie, name: front_session) や JWT 用 apiKey-in-header の security requirement を持つ endpoint で、test 側は actingAs(\$user) で session を成立させて認証を通している(実際の cookie / header は test request に乗らない)。
src/Internal/SecuritySchemeIntrospector 周辺を見ると bearer 専用の判定になっており、cookie / apiKey の差し込み口がない。
問題
actingAs() を使った Laravel test は本ライブラリの想定する「実 header / 実 cookie で認証」ではなく、Auth ファサードの内部状態で済ませる。session driver も実際の Cookie 往復を発生させない
- 結果として「impl は正しく認証されている、test も通っている」のに validator から見ると security NG
- bearer に限らずほぼ全ての非-Bearer auth scheme で同じ問題が発生する(OAuth Cookie、OAuth Bearer、OpenID Connect、API Key in header / cookie / query 全て)
やること
auto_inject_dummy_bearer の機能を拡張するか、新設定として汎用化する案。どちらかの形で:
案 A: auto_inject_dummy_bearer を auto_inject_dummy_credentials に拡張
'auto_inject_dummy_credentials' => true, // 既存 auto_inject_dummy_bearer の上位互換
bearer に加え、cookie / apiKey-in-header / apiKey-in-query 全てに dummy 値を validator のビューだけに注入する。Symfony Request 自体は触らない。
案 B: 設定でスキーマごとに dummy 値を指定
'auto_inject_dummy_credentials' => [
'bearerAuth' => 'Bearer test-token',
'CookieAuth' => ['front_session' => 'test-session', 'admin_session' => 'test-admin-session'],
'JwtToken' => 'Bearer test-jwt',
],
scheme 名と値を明示的にひも付ける。複数 cookie / 複数 spec で名前が違う場合に対応。
案 C: skip_security_validation 設定で security 部分だけ off
'skip_security_validation' => true, // 他の request validation は維持、security のみ skip
「test が actingAs() で済ませている」現実を受け入れて、security の機械検証を無効化する逃げ。最低限 path/query/body の type 検証だけは効く。
個人的推奨: 案 A をデフォルトに、案 B を細かく制御したい consumer 用に提供。案 C は短期 escape として有用。
ゴール
actingAs() ベースの test が auto_validate_request: true で false-fail しない
- 実際に security scheme を test したいケース(test が明示的に header / cookie を載せる)はそのまま検証される
- 追加した設定の test が library 側 CI で担保される
関連
- consumer 側調査: studio-design/studio-api PR #6617(Phase 1.5 として
auto_validate_request を試した結果)
- 関連既存設定:
auto_inject_dummy_bearer (src/Laravel/config.php)
背景
auto_validate_request: trueを有効化したとき、actingAs() / auth middleware bypass で認証している test が「security requirement not satisfied」で大量失敗する。現状のauto_inject_dummy_bearerは bearer scheme のみ を対象としているため、cookie / apiKey-in-header 系 security scheme はカバーできない。現状
studio-design/studio-api PR #6617 のフォローで
auto_validate_request: trueを試したところ、3994 tests 中 250+ 件が以下のような失敗を出した:これら spec 上は
CookieAuth(type: apiKey, in: cookie, name: front_session) や JWT 用 apiKey-in-header の security requirement を持つ endpoint で、test 側はactingAs(\$user)で session を成立させて認証を通している(実際の cookie / header は test request に乗らない)。src/Internal/SecuritySchemeIntrospector周辺を見ると bearer 専用の判定になっており、cookie / apiKey の差し込み口がない。問題
actingAs()を使った Laravel test は本ライブラリの想定する「実 header / 実 cookie で認証」ではなく、Auth ファサードの内部状態で済ませる。session driver も実際の Cookie 往復を発生させないやること
auto_inject_dummy_bearerの機能を拡張するか、新設定として汎用化する案。どちらかの形で:案 A:
auto_inject_dummy_bearerをauto_inject_dummy_credentialsに拡張bearer に加え、cookie / apiKey-in-header / apiKey-in-query 全てに dummy 値を validator のビューだけに注入する。Symfony Request 自体は触らない。
案 B: 設定でスキーマごとに dummy 値を指定
scheme 名と値を明示的にひも付ける。複数 cookie / 複数 spec で名前が違う場合に対応。
案 C: skip_security_validation 設定で security 部分だけ off
「test が actingAs() で済ませている」現実を受け入れて、security の機械検証を無効化する逃げ。最低限 path/query/body の type 検証だけは効く。
個人的推奨: 案 A をデフォルトに、案 B を細かく制御したい consumer 用に提供。案 C は短期 escape として有用。
ゴール
actingAs()ベースの test がauto_validate_request: trueで false-fail しない関連
auto_validate_requestを試した結果)auto_inject_dummy_bearer(src/Laravel/config.php)