【必見】Experience CloudでLWRを採用すべき決定的な理由

【ペットクリニックサイト 制作日誌 Vol.4】ReactとSalesforce Headless API連携:CORS制約とレートリミット対策

A modern, high-end editorial tech illustration depicting abstract web architecture and cloud API integration. In the center, a sleek translucent visual proxy node acts as an illuminated bridge, connecting a vibrant glowing modern frontend dashboard interface on one side to a powerful, geometric cloud database structure on the other. Streams of neon cyan and warm amber light represent data traffic flowing smoothly through security gateways and intercepted pathways. The aesthetic is clean, isometric 3D render with dark mode colors, deep blues, glassmorphism, glowing fiber-optic data channels, and soft depth of field, conveying seamless technical connectivity and modern software engineering. 開発・LWC

フロントエンド(SPA)からHeadless Identity APIを呼び出す際、ブラウザ特有のセキュリティ制約(CORSやOpaque Redirect)が技術的な障壁となります。

第四弾である本記事では、React環境での制約突破手法と、開発効率を維持するための対策を解説します。

前回の記事はこちら
【ペットクリニックサイト 制作日誌 Vol.3】外部クライアントアプリケーション(ECA)を用いたHeadless Identity認証設定

BESPOKE ONE Point for Developers

今回の連載記事で作成したReactサイトとSalesforceコンポーネントをGitHubで公開しています。 ぜひ Clone して、あなたの組織で動かしてみてください。

GitHub - bespokeone/Pet-Clinic: https://bespokeone.site/pet-clinic-build-log/
Contribute to bespokeone/Pet-Clinic development by creating an account on GitHub.
LWRって何?どんなメリットがあるの?
そんな疑問を解決するにはまずは以下の記事をご覧ください。
Salesforce LWRとは? Experience Cloudの次世代ランタイムを徹底解説

事実(仕様に基づく通信制約)

実装コード(ローカルプロキシとモック関数)

ローカル開発環境におけるVite Proxyのハックと、APIレートリミットを回避するためのモック関数の実装です。

// vite.config.ts
export default defineConfig({
  server: {
    proxy: {
      '/TatehamaPetClinic': {
        target: 'https://orgfarm-...',
        changeOrigin: true,
        secure: false,
        configure: (proxy) => {
          proxy.on('proxyRes', (proxyRes, req, res) => {
            // /authorize が返す 302 リダイレクトを強引に 200 に変換し、フロントエンドでLocationを抽出可能にする
            if (req.url?.includes('/services/oauth2/authorize') && proxyRes.statusCode === 302) {
              const location = proxyRes.headers['location'];
              proxyRes.statusCode = 200;
              proxyRes.headers['x-intercepted-location'] = location;
            }
          });
        }
      }
    }
  }
});
// API呼び出しモジュール (salesforceAuth.ts) の抜粋
export async function sendOtpRequest(email: string) {
  // 開発環境かつモックフラグが有効な場合は、Salesforce APIを叩かずダミーレスポンスを返却する
  if (import.meta.env.DEV && import.meta.env.VITE_USE_MOCK_OTP === 'true') {
    return new Promise(resolve => setTimeout(() => resolve({ success: true, mockIdentifier: 'mock-id-1234' }), 500));
  }
  // 実API通信処理の実装...
}

推測・見解(本番環境でのリダイレクト戦略)

SPA単体でのOAuthの限界

SPA単体で完全なHeadless体験(リロードなし)を本番環境で実現するには、BFF(Node.jsやEdge Function等)の導入を強く推奨します。

302 Redirect を、Reactなどのブラウザの fetch APIで受け止めようとすると、CORS制約とOpaque(不透明な)リダイレクトの仕様により中身が読み取れず、Vite Proxyのハックは静的ホスティングでは機能しません。BFFの追加が困難な場合は、fetch による非同期通信を諦め、window.location.href = authorizeUrl でブラウザごとSalesforceへ遷移させる「フルリダイレクト方式」を許容するトレードオフの判断が必要です。

開発時の知見(ハマりどころ)

  • OTP要求の1時間レートリミット
    /services/auth/headless/init/registration に対して、同一IPまたはメールアドレスから約5〜10分間に5回連続でリクエストを送ると、1時間のロックアウト(429 Too Many Requests)が発生します。開発中は上記のようなモック関数を組み込み、API呼び出しをバイパスする仕組みを用意することが開発効率維持の鍵となります。
  • reCAPTCHAとViteキャッシュトラップ
    Headless Identityの要件でreCAPTCHAのシークレットを更新した際、フロントエンドのビルドキャッシュ(.env等の古いサイトキー)が残り、400 Bad Request が発生し続けるケースがあります。環境変数変更時は完全な再ビルドを実施してください。

まとめ

SPA(React)からのHeadless API連携は、ブラウザ特有のCORSや不透明なリダイレクト(Opaque Redirect)の制約をどう突破するかが実装の鍵となります。

ローカル開発環境でのVite Proxyを利用したリダイレクトハックは有効ですが、本番環境ではBFF(Backend For Frontend)の導入やフルリダイレクトの許容といったインフラ構成の決断が必要です。また、Salesforceの厳格なOTPレートリミット(1時間ブロック)による開発の停滞を防ぐため、環境変数を用いたAPI通信のモック化を初期段階で組み込むことを強く推奨します。

続いて第五弾の記事もご覧ください。

参考URL

Configure a Connected App for the Authorization Code and Credentials Flow

Headless Identity APIs: Headless Registration Flow for Private Clients

BESPOKE ONEの管理人

福島 瑛二

2013年にJavaエンジニアとしてのキャリアをスタート。2019年にSalesforceと出会い、Salesforceエンジニアの道へ。

デザインや UI/UX の観点からもシステムを捉え、ユーザーにとって心地よい体験を実装することにやりがいを感じています。

CRM(顧客データ)や Data 360 と連携した高度なサイトを目に見える形で表現できる Experience Cloud に大きな可能性を見出しており、バックエンドのデータ構造とフロントエンドの表現力を極めることがこれからの Salesforce エンジニアに求められるスキルだと確信しています。

Trailblazer: efukushima

福島 瑛二をフォローする

読者の声

タイトルとURLをコピーしました
B-ONE 案内エージェント