
Summary
この文書の要点
- 外部SDKから受け取るトークンは必ずサーバー側で検証する。
- 外部ユーザーIDと内部ユーザーIDを分けて保存する。
- JWTには利用者IDだけでなく、用途、期限、nonce、許可スコープを入れる。
- 受け渡し先から戻る導線では、state検証と再認証条件を必ず確認する。
どこが設計の難所か
外部デザインツール上で作られたデータを業務アプリへ渡す場合、フロントエンドで取得したユーザー情報をそのまま信じる実装になりがちです。これでは、なりすましや別ユーザーへの紐づけミスを防げません。
外部ツールのSDKには、開発環境、本番環境、許可ドメイン、トークン期限などの制約があります。API側では、外部ユーザーが既存の内部アカウントと同一人物かを判断する必要があります。
外部デザインツールや埋め込み機能と連携する場合、アプリ側の利用者情報を一時的に外部へ渡す場面があります。ここで長寿命のJWTや広い権限を渡すと、漏えい時の影響が大きくなります。
境界をどう切るか
連携では、外部SDKからJWTを取得し、Laravel APIで署名、発行者、有効期限、対象アプリを検証します。その上で外部ユーザーIDを内部ユーザーまたは一時セッションに対応付け、データ受け渡しを行います。
設計では、JWTをセッションそのものにせず、特定操作のための短命なチケットとして扱います。発行者、対象者、用途、期限、許可スコープを明示し、再利用を防ぐnonceやjtiを持たせます。
実装で効く細部
APIには、ハンドオフ作成、状態確認、確定、破棄のエンドポイントを分けます。一時データには期限を持たせ、利用後は無効化します。Viteでビルドする外部アプリ側には、APIベースURLや環境識別子を埋め込みすぎないようにします。
Laravel側でJWTを発行する場合、秘密鍵や署名方式を環境ごとに管理し、発行ログを残します。Vite側ではJWTをlocalStorageへ長く置かず、外部遷移直前に取得し、戻り時にはstateとnonceを照合します。
- JWTのexpは短くし、refresh tokenの代わりに使わない。
- aud、iss、scopeを検証し、別用途のトークンを受け付けない。
- jtiやnonceを保存し、同じトークンの再利用を検出できるようにする。
壊れ方を観測する
検証では、期限切れJWT、別アプリ向けJWT、署名不正、同じハンドオフの二重利用、内部ユーザー未紐づけのケースを確認します。ローカルと本番で許可ドメインが正しく分かれているかも重要です。
検証では、期限切れ、署名不一致、aud不一致、scope不足、nonce再利用、戻りURL改ざんを確認します。正常系の画面遷移だけでなく、途中でタブを閉じた場合や再読み込みした場合の扱いも見る必要があります。
捨てた選択肢とトレードオフ
外部ツール連携は利用者体験を滑らかにできますが、認証境界が増えます。初期段階では一時データの保存範囲を絞り、内部アカウントへの確定操作を明示的にする方が安全です。
短命トークンは安全ですが、通信遅延やユーザー操作の中断で期限切れになりやすくなります。期限を伸ばせば体験は安定しますが、リスクは増えます。用途ごとに寿命と再発行導線を分けるのが現実的です。
現場に残す判断軸
外部アプリ連携では、SDKが返す情報を便利な入力として扱い、信頼判断はサーバー側で行います。JWT検証と一時ハンドオフを分けることで、安全なデータ受け渡しができます。
JWT受け渡しの設計では、署名できることより、何をどれだけの時間許可するかが重要です。短命、用途限定、再利用検知を揃えると、外部連携の境界が明確になります。


