---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 94
  claims_with_evidence: 91
  claims_without_evidence: 3
confidence_derived: 0.97
---

# 根拠レポート：decap-cms-lib-auth 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：91 / 94、根拠なし：3
- 優先レビュー（高）
  1. **C-43（UT-AUT-043）**：fetchエラー時のコールバック挙動 - refreshメソッドのPromise.catchの挙動がコールバック形式で正しくエラーを渡すか、コード上では`.catch(cb)`のみでありcb(error)形式になるかの確認が必要
  2. **C-58（UT-AUT-058）**：sha256関数の具体的な期待値 - Web Crypto APIのモック方法とハッシュ値の具体的検証方法は実装テスト時に決定する必要がある
  3. **C-90（UT-AUT-090）**：stateパラメータのエスケープ処理 - どのような状況でエスケープされた引用符が発生するかの具体的シナリオが不明確

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/decap-cms-lib-auth/src/utils.js` - createNonce, validateNonce, isInsecureProtocol関数
- E-02: `packages/decap-cms-lib-auth/src/netlify-auth.js` - NetlifyError, Authenticatorクラス（constructor, handshakeCallback, authorizeCallback, getSiteID, authenticate, refresh）
- E-03: `packages/decap-cms-lib-auth/src/implicit-oauth.js` - ImplicitAuthenticatorクラス（constructor, authenticate, completeAuth）
- E-04: `packages/decap-cms-lib-auth/src/pkce-oauth.js` - sha256, generateVerifierCode, createCodeChallenge, createCodeVerifier, getCodeVerifier, clearCodeVerifier関数、PkceAuthenticatorクラス（constructor, _loadOidcConfig, authenticate, completeAuth）
- E-05: `packages/decap-cms-lib-auth/src/index.js` - モジュールエクスポート定義
- E-06: `packages/decap-cms-lib-auth/package.json` - パッケージ依存関係（immutable, lodash, uuid）
- E-07: `packages/decap-cms-lib-auth/index.d.ts` - TypeScript型定義（NetlifyAuthenticator.refresh）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | UT-AUT-001: createNonceがnonceを生成しsessionStorageに保存する | E-01（utils.js L3-7） | ○ |
| C-02 | UT-AUT-002: 生成nonceがUUID v4形式である | E-01（utils.js L1, L4: uuid v4使用）, E-06 | ○ |
| C-03 | UT-AUT-003: 有効なnonceが検証に成功する | E-01（utils.js L9-13） | ○ |
| C-04 | UT-AUT-004: 無効なnonceが検証に失敗する | E-01（utils.js L13: check === valid） | ○ |
| C-05 | UT-AUT-005: sessionStorageにnonceが存在しない場合falseが返る | E-01（utils.js L10-11: auth && JSON.parse(auth).nonce） | ○ |
| C-06 | UT-AUT-006: 検証後にlocalStorageからdecap-cms-authが削除される | E-01（utils.js L12） | ○ |
| C-07 | UT-AUT-007: httpsプロトコルでfalseが返る | E-01（utils.js L17） | ○ |
| C-08 | UT-AUT-008: httpかつlocalhostでfalseが返る | E-01（utils.js L21） | ○ |
| C-09 | UT-AUT-009: httpかつ127.0.0.1でfalseが返る | E-01（utils.js L22） | ○ |
| C-10 | UT-AUT-010: httpかつ外部ホストでtrueが返る | E-01（utils.js L16-23: 全条件を満たさない場合） | ○ |
| C-11 | UT-AUT-011: NetlifyErrorがエラーオブジェクトを保持する | E-02（netlify-auth.js L8-10） | ○ |
| C-12 | UT-AUT-012: NetlifyError.toStringがメッセージを返す | E-02（netlify-auth.js L11-13） | ○ |
| C-13 | UT-AUT-013: errがnullの場合toStringがundefinedを返す | E-02（netlify-auth.js L12: this.err && this.err.message） | ○ |
| C-14 | UT-AUT-014: errにmessageがない場合undefinedを返す | E-02（netlify-auth.js L12） | ○ |
| C-15 | UT-AUT-015: Authenticatorデフォルト設定でインスタンス生成 | E-02（netlify-auth.js L36-40, L4-5） | ○ |
| C-16 | UT-AUT-016: Authenticatorカスタム設定でインスタンス生成 | E-02（netlify-auth.js L37-39） | ○ |
| C-17 | UT-AUT-017: base_url空文字でデフォルトAPI使用 | E-02（netlify-auth.js L38: trimEnd結果が空 → NETLIFY_API） | ○ |
| C-18 | UT-AUT-018: auth_endpoint空文字でデフォルト値使用 | E-02（netlify-auth.js L39: trim結果が空 → AUTH_ENDPOINT） | ○ |
| C-19 | UT-AUT-019: site_id設定済みでその値が返る | E-02（netlify-auth.js L80-82） | ○ |
| C-20 | UT-AUT-020: localhostでdemo.decapcms.orgが返る | E-02（netlify-auth.js L83-84） | ○ |
| C-21 | UT-AUT-021: 外部ホストでホスト名が返る | E-02（netlify-auth.js L84） | ○ |
| C-22 | UT-AUT-022: ポート番号付きホストでホスト名のみ返る | E-02（netlify-auth.js L83: split(':')[0]） | ○ |
| C-23 | UT-AUT-023: provider未指定でエラーコールバック | E-02（netlify-auth.js L91-97） | ○ |
| C-24 | UT-AUT-024: siteID取得不可でエラーコールバック | E-02（netlify-auth.js L98-105） | ○ |
| C-25 | UT-AUT-025: 有効providerで認証ウィンドウが開く | E-02（netlify-auth.js L107-129） | ○ |
| C-26 | UT-AUT-026: scopeオプションがURLに付与される | E-02（netlify-auth.js L112-114） | ○ |
| C-27 | UT-AUT-027: login=trueがURLに付与される | E-02（netlify-auth.js L115-117） | ○ |
| C-28 | UT-AUT-028: beta_inviteがURLに付与される | E-02（netlify-auth.js L118-120） | ○ |
| C-29 | UT-AUT-029: invite_codeがURLに付与される | E-02（netlify-auth.js L121-123） | ○ |
| C-30 | UT-AUT-030: 未知providerでgithubサイズが使用される | E-02（netlify-auth.js L107: PROVIDERS[provider] \|\| PROVIDERS.github） | ○ |
| C-31 | UT-AUT-031: bitbucketで専用ウィンドウサイズ | E-02（netlify-auth.js L25-28: height 500） | ○ |
| C-32 | UT-AUT-032: 正しいメッセージでハンドシェイク成功 | E-02（netlify-auth.js L42-51） | ○ |
| C-33 | UT-AUT-033: 異なるproviderメッセージで何も起こらない | E-02（netlify-auth.js L44: 'authorizing:'+options.provider比較） | ○ |
| C-34 | UT-AUT-034: 異なるoriginメッセージで何も起こらない | E-02（netlify-auth.js L44: e.origin === this.base_url） | ○ |
| C-35 | UT-AUT-035: 成功メッセージでデータがコールバックに渡される | E-02（netlify-auth.js L59-66） | ○ |
| C-36 | UT-AUT-036: エラーメッセージでエラーコールバック | E-02（netlify-auth.js L67-74） | ○ |
| C-37 | UT-AUT-037: 異なるoriginのメッセージが無視される | E-02（netlify-auth.js L55-57） | ○ |
| C-38 | UT-AUT-038: provider未指定でrefreshエラー | E-02（netlify-auth.js L137-143） | ○ |
| C-39 | UT-AUT-039: refresh_token未指定でrefreshエラー | E-02（netlify-auth.js L137-143） | ○ |
| C-40 | UT-AUT-040: siteID取得不可でrefreshエラー | E-02（netlify-auth.js L144-151） | ○ |
| C-41 | UT-AUT-041: コールバック指定時にfetchとコールバック呼び出し | E-02（netlify-auth.js L152-161） | ○ |
| C-42 | UT-AUT-042: コールバック未指定時にPromise返却 | E-02（netlify-auth.js L156-158） | ○ |
| C-43 | UT-AUT-043: fetchエラー時にコールバックへエラー伝搬 | E-02（netlify-auth.js L161: .catch(cb)） | △ |
| C-44 | UT-AUT-044: ImplicitAuthenticatorのauth_url構築 | E-03（implicit-oauth.js L8-14） | ○ |
| C-45 | UT-AUT-045: clearHash関数の保持 | E-03（implicit-oauth.js L13） | ○ |
| C-46 | UT-AUT-046: 非セキュアプロトコルでエラー | E-03（implicit-oauth.js L17-19）, E-01 | ○ |
| C-47 | UT-AUT-047: 正しいパラメータでリダイレクト | E-03（implicit-oauth.js L21-39） | ○ |
| C-48 | UT-AUT-048: promptオプションがURLに含まれる | E-03（implicit-oauth.js L27-29） | ○ |
| C-49 | UT-AUT-049: resourceオプションがURLに含まれる | E-03（implicit-oauth.js L31-33） | ○ |
| C-50 | UT-AUT-050: stateにauth_type=implicitとnonce含む | E-03（implicit-oauth.js L35-37） | ○ |
| C-51 | UT-AUT-051: prompt=nullでURLに含まれない | E-03（implicit-oauth.js L27: != null） | ○ |
| C-52 | UT-AUT-052: prompt=undefinedでURLに含まれない | E-03（implicit-oauth.js L27: != undefined） | ○ |
| C-53 | UT-AUT-053: access_tokenでトークンデータがコールバックに渡る | E-03（implicit-oauth.js L65-68） | ○ |
| C-54 | UT-AUT-054: completeAuth成功時にclearHash呼び出し | E-03（implicit-oauth.js L51） | ○ |
| C-55 | UT-AUT-055: 無効nonceでエラー | E-03（implicit-oauth.js L56-59） | ○ |
| C-56 | UT-AUT-056: errorパラメータでエラーコールバック | E-03（implicit-oauth.js L61-63） | ○ |
| C-57 | UT-AUT-057: access_tokenもerrorもない場合早期リターン | E-03（implicit-oauth.js L47-49） | ○ |
| C-58 | UT-AUT-058: sha256のハッシュ計算 | E-04（pkce-oauth.js L6-12） | △ |
| C-59 | UT-AUT-059: 128文字のverifierコード生成 | E-04（pkce-oauth.js L15-25: Uint8Array(128)） | ○ |
| C-60 | UT-AUT-060: 許可文字セットのみで構成 | E-04（pkce-oauth.js L18: chars定義） | ○ |
| C-61 | UT-AUT-061: code_challengeのBase64URL生成 | E-04（pkce-oauth.js L27-31） | ○ |
| C-62 | UT-AUT-062: createCodeVerifierの保存 | E-04（pkce-oauth.js L35-39） | ○ |
| C-63 | UT-AUT-063: getCodeVerifierの取得 | E-04（pkce-oauth.js L41-43） | ○ |
| C-64 | UT-AUT-064: verifier未保存時null返却 | E-04（pkce-oauth.js L42: sessionStorage.getItem） | ○ |
| C-65 | UT-AUT-065: clearCodeVerifierの削除 | E-04（pkce-oauth.js L45-47） | ○ |
| C-66 | UT-AUT-066: 非OIDC構成でURL構築 | E-04（pkce-oauth.js L63-77） | ○ |
| C-67 | UT-AUT-067: OIDCモードでoidc_url設定 | E-04（pkce-oauth.js L68-71） | ○ |
| C-68 | UT-AUT-068: content_type保持 | E-04（pkce-oauth.js L75） | ○ |
| C-69 | UT-AUT-069: 既設定時の早期リターン | E-04（pkce-oauth.js L80） | ○ |
| C-70 | UT-AUT-070: OIDCディスカバリ | E-04（pkce-oauth.js L83-97） | ○ |
| C-71 | UT-AUT-071: oidc_url未設定エラー | E-04（pkce-oauth.js L81） | ○ |
| C-72 | UT-AUT-072: fetchネットワークエラー | E-04（pkce-oauth.js L83-85） | ○ |
| C-73 | UT-AUT-073: 非OKレスポンスエラー | E-04（pkce-oauth.js L86-88） | ○ |
| C-74 | UT-AUT-074: JSON解析失敗エラー | E-04（pkce-oauth.js L89-91） | ○ |
| C-75 | UT-AUT-075: authorization_endpoint欠落エラー | E-04（pkce-oauth.js L92-94） | ○ |
| C-76 | UT-AUT-076: token_endpoint欠落エラー | E-04（pkce-oauth.js L92-94） | ○ |
| C-77 | UT-AUT-077: PKCE非セキュアプロトコルエラー | E-04（pkce-oauth.js L100-102）, E-01 | ○ |
| C-78 | UT-AUT-078: OIDC設定読み込みエラー伝搬 | E-04（pkce-oauth.js L103-107） | ○ |
| C-79 | UT-AUT-079: PKCEリダイレクト | E-04（pkce-oauth.js L109-124） | ○ |
| C-80 | UT-AUT-080: stateにauth_type=pkceとnonce | E-04（pkce-oauth.js L115） | ○ |
| C-81 | UT-AUT-081: verifier保存確認 | E-04（pkce-oauth.js L120） | ○ |
| C-82 | UT-AUT-082: codeでトークン交換 | E-04（pkce-oauth.js L156-188） | ○ |
| C-83 | UT-AUT-083: トークン交換後verifierクリア | E-04（pkce-oauth.js L186） | ○ |
| C-84 | UT-AUT-084: URLからcodeパラメータ除去 | E-04（pkce-oauth.js L134） | ○ |
| C-85 | UT-AUT-085: PKCE無効nonceエラー | E-04（pkce-oauth.js L147-149） | ○ |
| C-86 | UT-AUT-086: PKCEエラーパラメータ処理 | E-04（pkce-oauth.js L152-154） | ○ |
| C-87 | UT-AUT-087: code/error不在の早期リターン | E-04（pkce-oauth.js L136-138） | ○ |
| C-88 | UT-AUT-088: form-urlencoded形式ボディ | E-04（pkce-oauth.js L176-177） | ○ |
| C-89 | UT-AUT-089: JSON形式ボディ | E-04（pkce-oauth.js L178） | ○ |
| C-90 | UT-AUT-090: stateエスケープ処理 | E-04（pkce-oauth.js L141-145） | △ |
| C-91 | UT-AUT-091: completeAuthのOIDCエラー伝搬 | E-04（pkce-oauth.js L157-161） | ○ |
| C-92 | UT-AUT-092: code_verifierの送信確認 | E-04（pkce-oauth.js L171） | ○ |
| C-93 | UT-AUT-093: DecapCmsLibAuthエクスポート | E-05（index.js L4） | ○ |
| C-94 | UT-AUT-094: 名前付きエクスポート | E-05（index.js L5） | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-43**: `refresh`メソッドの`.catch(cb)`で、cbがerrorオブジェクト1引数で呼ばれるが、通常のコールバック規約（err, data）とは異なるパターン。実際のfetchエラー時の挙動をテスト実装時に確認が必要。
  - 候補：fetchのモックによる実挙動テスト / Promiseのreject値の型確認
- **C-58**: `sha256`関数はWeb Crypto APIに依存しており、具体的な期待ハッシュ値はテスト環境のモック実装に依存する。テストの具体的な期待値は実装時に決定する必要がある。
  - 候補：jsdomのcrypto.subtle.digestモック / 既知入力の期待ハッシュ値をハードコード
- **C-90**: `completeAuth`のstateパラメータJSON解析でSyntaxErrorが発生した場合の`replace(/\\"/g, '"')`処理。このようなエスケープが実際にどのOAuthプロバイダで発生するかの具体的シナリオが不明。
  - 候補：実際のOAuthプロバイダ（Azure AD等）のリダイレクトレスポンス確認 / GitHub Issuesの関連バグレポート確認

## 5) リスクフラグ（レビュー観点）
- **リスク1（中リスク）**: validateNonce関数内でlocalStorage.removeItemを使用しているが、sessionStorageにセットされたnonceをlocalStorageから削除している。これが意図した動作かどうか確認が必要（E-01: utils.js L12）。
- **リスク0（低リスク）**: NetlifyError.toStringでthis.errがundefinedの場合の挙動はテスト済みだが、errが文字列型の場合のエッジケースはカバーしていない。
- **リスク1（中リスク）**: PkceAuthenticator.completeAuthでfetchのレスポンスエラー（非200ステータス）時のハンドリングが実装にない。response.ok チェックなしで response.json() を呼んでいる（E-04: pkce-oauth.js L174-183）。
- **リスク0（低リスク）**: ImplicitAuthenticator.authenticateでpromptとresourceの条件チェックが `!= null && != undefined` と緩い等価演算子を使用しており、空文字列("")でもURLに追加される。

## 6) レビュアーチェックリスト（最小）
- [ ] validateNonce内のlocalStorage.removeItem（L12）がsessionStorage.removeItemの誤りでないか確認
- [ ] PkceAuthenticator.completeAuthのfetchレスポンスで非200ステータス時のエラーハンドリング欠如が問題ないか確認
- [ ] refreshメソッドのPromise/コールバック二重パターンのエッジケースが十分カバーされているか確認
- [ ] stateパラメータのエスケープ処理（pkce-oauth.js L143-144）の具体的発生シナリオを特定
- [ ] ImplicitAuthenticator.authenticateのprompt/resource空文字列時の挙動が意図通りか確認
