# BONE FLOW #024 — API登録のCORS制限 / v1.0.276

状態：Development / Not Completed。対象：`finance-voucher.html` の商品情報API設定画面。

## v275で登録できなかった理由

Yahoo!ショッピングの商品検索APIはJAN検索を提供しているが、v275のブラウザから直接 `fetch()` する方式は、APIがCORSを許可しない環境で応答を読めない。ブラウザに表示される「通信できません」はID不正の証拠ではない。

## v276の修正

1. 直接API接続の実際のHTTP/JSON検証を保持。
2. JavaScriptの通信エラー時、`./bone-product-proxy.v276.php` に同一サイトで接続可能なら、中継してHTTP/JSONを検証。
3. 中継が未配置またはPHP cURLが無効なら、**未検証**と明示。偽PASSや資格情報の保存は行わない。
4. 中継が使えるときの商品検索にも同じ方式を採用。商品画像・参考価格候補を表示。保存済み伝票・仕訳金額は変更しない。

## 中継の安全性・運用上の前提

中継は標準HTML/JSの一部ではない。**任意のPHP追加機能**であり、`install.bat` は自動設置しない。Standard版のHTML+JSのみという配布制約は変更しない。

- 運用サーバー側でPHP 8.0以降、cURL拡張、HTTPS実行、外部HTTPS通信が可能であること。
- PHPが正しく実行されるサーバーであると管理者が確認してから、ZIP内の `optional-server/bone-product-proxy.v276.php` を `boneflow/sample/024/calendar/bone-product-proxy.v276.php` として配置する。
- **PHPが実行されずソースがそのまま配信される環境には配置しないこと。** `?ready=1` を開きJSONの `service` が `bf024-product-proxy` か確認。
- APIのID・キーは画面内でだけ保持し、HTTPS POSTで中継へ送信する。中継はキーをセッション・ディスク・DBに保存しない（CSRFトークンと短期レート制限のみセッションに保存）。
- 中継は固定されたYahoo!・楽天・UPCitemdb HTTPS先だけに転送。任意URLへ転送しない。リダイレクトを追従しない。TLS証明書を確認し、同一オリジン・CSRF・通信制限を設ける。
- PHPの通信・アクセスログ、reverse proxy、外部APIのアクセスログ等への保存はサーバー設定に依存する。不要なリクエスト本文のログ記録は禁止。
- 公開サービスに長期間運用する場合は追加の認証・IP/ユーザー別利用制限・サーバー管理が必要。今回の中継はサーバー管理者によるオプトインのみ。

## API登録画面での利用手順

伝票画面 → 「外部商品データベース・API設定」 → Yahoo!などのID/キーを入力 →「登録・接続検証」。CORSで失敗した場合は中継に自動フォールバック。成功したときだけ画面内で有効化。接続できなければ未登録・未検証。登録成功後は取得先を選んでJAN検索。

**注意**：Windows localhostとpcsr.netは別のWebサーバーである。中継の有無もそれぞれ異なる。DBと既存科目・伝票は上書きしない。
