Skip to content

feature — auto-inject for non-Bearer auth schemes (cookie / apiKey-in-header) #178

@wadakatu

Description

@wadakatu

背景

auto_validate_request: true を有効化したとき、actingAs() / auth middleware bypass で認証している test が「security requirement not satisfied」で大量失敗する。現状の auto_inject_dummy_bearerbearer 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_bearerauto_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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions