SCALE — Build Lab
認証 · TYPESCRIPT UTILITY

クロスドメイン認証ブリッジ

CATEGORY認証 TYPETypeScript Utility EFFORT30〜60分 DIFFICULTY
PRIMARY CODE
typescript · lib/external-auth.ts
const SKIP_AUTH_DOMAINS = [/* 独自認証システム */];

export function withAuthQuery(externalUrl: string, user: UserLite | null): string {
  if (!user) return externalUrl;
  if (SKIP_AUTH_DOMAINS.some(d => externalUrl.includes(d))) return externalUrl;
  const payload = { id: user.id, name: user.name, email: user.email, /* PWは含めない */ };
  const json = JSON.stringify(payload);
  const utf8 = new TextEncoder().encode(json);
  let bin = '';
  utf8.forEach(b => { bin += String.fromCharCode(b); });
  const b64 = btoa(bin);
  const sep = externalUrl.includes('?') ? '&' : '?';
  return `${externalUrl}${sep}auth=${encodeURIComponent(b64)}`;
}
DEPENDENCIES
(標準APIのみ)
USE CASES
  • SCALE Base → 分離プロジェクト(finance/x-app/recruit 等)への認証引き継ぎ
  • マルチドメイン構成での SSO 風味

withAuthQuery(クロスドメイン認証ブリッジ)

:LiTarget: 用途

別オリジンのプロジェクトへリンクを貼る時、URL クエリ ?auth=<base64> でユーザー情報を引き継ぐ。受け取り側は AuthProvider が初回 useEffect でクエリを読んで sessionStorage に保存 → クエリは history.replaceState で削除。

:LiCode: コード

const SKIP_AUTH_DOMAINS = [/* 独自認証システム */];

export function withAuthQuery(externalUrl: string, user: UserLite | null): string {
  if (!user) return externalUrl;
  if (SKIP_AUTH_DOMAINS.some(d => externalUrl.includes(d))) return externalUrl;
  const payload = { id: user.id, name: user.name, email: user.email, /* PWは含めない */ };
  const json = JSON.stringify(payload);
  const utf8 = new TextEncoder().encode(json);
  let bin = '';
  utf8.forEach(b => { bin += String.fromCharCode(b); });
  const b64 = btoa(bin);
  const sep = externalUrl.includes('?') ? '&' : '?';
  return `${externalUrl}${sep}auth=${encodeURIComponent(b64)}`;
}

:LiAlertCircle: 注意

  • パスワードは絶対に渡さない(id/name/email/role/allowedSystems のみ)
  • 独自認証ドメインは SKIP_AUTH_DOMAINS で除外(URLをきれいに保つ)