event-manual / chapter 5

4S 統合の全体像

@event/fours-sdk

@event/fours-sdk が唯一の型付き 4S クライアントである。すべてのモジュール・アプリはこの SDK を通して 4S を読み、直接 fetch を書かない。SDK は4つの面(surface)を提供する。

4つの面

主関数認証用途
event-readfetchEvent / listSessionsFromEvent / listSpeakersFromEvent / listPassTiers / get4SHealthなし(public read)セッション・登壇者・チケット・会場の読み出し(第6章)
profile-readfetch4SUser / fetchPublicProfile / fetchOrgMembers / extractSlug / normNameなしユーザー / 組織プロフィール、名寄せ
handoff / identityverify4SUser / createSessionCodec / createLoginProxyHandler / createCognitoRefreshHandler、client 側 tokenStore(@event/fours-sdk/clientBearer idTokenログインレス handoff・本人確定・cookie セッション(第9章)
admin (service)isServiceConfigured / getServiceIdToken / fetchEntryIndex / fetchDescendantInfosservice アカウント Bearerentries 索引・リファラルツリー等の管理 API

接続モード matrix

mode は env の組み合わせから createFoursConfig() が一意に決める。判定優先順は上から。

mode条件挙動
mock-lockedUSE_MOCK_DATA4S に一切出ない。foursFetchPublic / fetchEvent は null
authenticatedFOURS_API_KEY ありwrite 系 API 可。Bearer は config.apiKey
public-readFOURS_PUBLIC_READ認証なし読み取りのみ
stubそれ以外読み書きとも no-op。render は落とさない

summarizeFoursConfig(config) は秘匿値を含まない診断サマリ(mode / base / hasApiKey 等)を返し、/api/4s/health 系のデバッグ UI に使う。

エンドポイント一覧(実コード観測ベース)

エンドポイント認証備考
event readGET /slug/{eventSlug}なしtype 判別レスポンス(event / user / organization)。sessions / speakers / stages / schedules / tickets / location
profile readGET /slug/{userSlug}なしorganizationMembers / userLinks / socialLinks / tags
org membersGET /organizations/{id}/members?page&perPageなしロスター母集団
configGET /configなしCOGNITO_USER_POOL_ID / COGNITO_USER_POOL_CLIENT_ID
identityGET /users/meBearer idToken正典の本人情報。client 申告の name/avatar は破棄
adminGET /manage/events/{id}/entries?perPage=200Bearer (service)slug/name→entryId 索引
adminGET /events/{id}/entries/{entryId}/referral-descendantsBearer (service)招待ツリー
loginPOST /auth/login(body: email または slug + password)なし@ の有無で email / slug を選ぶ
handoffPOST /auth/session-handoff/consume {code}なし(Origin 検査)400 / 403 / 404 / 410
handoffPOST /auth/session-handoff/mintCognito(4s.link のみ)イベントサイトからは物理的に呼べない
CognitoPOST https://cognito-idp.{region}.amazonaws.com/REFRESH_TOKEN_AUTH。SSRF 正規表現ガード
webhookPOST /api/4s/webhook(inbound)X-4S-Signature: sha256=<HMAC>raw body の HMAC-SHA256

transport と error handling

foursFetch / foursFetchPublic が全通信の関門である。設計方針:

route handler factory

サーバ側は factory を1行 mount するだけで済む:

// app/api/4s-session/login/route.ts
import { createFoursConfig, createLoginProxyHandler } from "@event/fours-sdk";
export const POST = createLoginProxyHandler(createFoursConfig());
export const runtime = "nodejs";
export const dynamic = "force-dynamic";

createLoginProxyHandler はブラウザ→4S の CORS 問題を server→server 転送で回避し、パスワードは保存せず転送のみ。404 と 401 を 401 に統一してユーザー名列挙オラクルを塞ぐ。createCognitoRefreshHandler は region / clientId をホワイトリスト正規表現で検証し、宛先を常に cognito-idp.<region>.amazonaws.com に限定する(SSRF 防止)。