イベント
概要
SDKは認証状態が変化したとき — ログイン、ログアウト、セッション期限切れ、トークン更新、エラー — にイベントを発行します。これらのイベントにサブスクライブして、UIの更新、アナリティクスの記録、副作用のトリガーを行えます。
イベントのサブスクライブ
auth.on() でイベントハンドラーを登録します:
const unsubscribe = auth.on('auth:login', (payload) => { console.log('ログインしました:', payload.user); console.log('方法:', payload.method);});
// 後で: サブスクライブ解除unsubscribe();auth.on() はサブスクライブ解除関数を返します。呼び出すとハンドラーが削除されます。
イベントリファレンス
auth:login
認証成功後(すべての方法)に発行:
auth.on('auth:login', (payload) => { // payload.session: Session // payload.user: User // payload.method: 'passkey' | 'emailCode' | 'social'});以下の後に発火:
auth.passkey.login()またはauth.passkey.signUp()auth.emailCode.verify()auth.social.loginWithPopup()またはauth.social.handleCallback()
auth:logout
サインアウト後に発行:
auth.on('auth:logout', (payload) => { // payload.redirectUri?: string(RPイニシエイテッドログアウトの場合)});auth.signOut() の後に発火します。
session:changed
セッション状態が変化したときに発行:
auth.on('session:changed', (payload) => { // payload.session: Session | null // payload.user: User | null
if (payload.session) { updateHeader(payload.user); } else { showLoginButton(); }});session:expired
セッションが期限切れまたは取り消されたときに発行:
auth.on('session:expired', (payload) => { // payload.reason: 'timeout' | 'revoked' | 'logout'
switch (payload.reason) { case 'timeout': showMessage('セッションが期限切れです。再度サインインしてください。'); break; case 'revoked': showMessage('管理者によりセッションが終了されました。'); break; case 'logout': // 通常のログアウト — auth:logoutで処理済み break; }});token:refreshed
トークンが更新されたときに発行:
auth.on('token:refreshed', (payload) => { // payload.session: Session(更新されたセッション情報) console.log('トークン更新完了。新しい有効期限:', payload.session.expiresAt);});auth:error
認証エラー発生時に発行:
auth.on('auth:error', (payload) => { // payload.error: AuthError console.error('認証エラー:', payload.error.message);
// エラートラッキングサービスに送信 trackError({ code: payload.error.code, message: payload.error.message, severity: payload.error.severity, });});イベント一覧
| イベント | ペイロード | 発火タイミング |
|---|---|---|
auth:login | { session, user, method } | ログイン成功後 |
auth:logout | { redirectUri? } | サインアウト後 |
session:changed | { session, user } | セッション状態変化 |
session:expired | { reason } | セッション期限切れ/取り消し |
token:refreshed | { session } | トークン自動更新 |
auth:error | { error } | 認証エラー |
パターン
UI状態管理
// 認証状態に基づいてナビゲーションヘッダーを更新auth.on('auth:login', ({ user }) => { document.getElementById('user-name').textContent = user.name; document.getElementById('auth-section').classList.add('authenticated');});
auth.on('auth:logout', () => { document.getElementById('auth-section').classList.remove('authenticated');});
auth.on('session:expired', () => { showModal('セッション期限切れ', '再度サインインしてください。');});アナリティクス
auth.on('auth:login', ({ method, user }) => { analytics.track('login', { method, userId: user.id, });});
auth.on('auth:logout', () => { analytics.track('logout');});
auth.on('auth:error', ({ error }) => { analytics.track('auth_error', { code: error.code, message: error.message, });});複数ハンドラー
同じイベントに複数のハンドラーを登録できます:
// ハンドラー1: UI更新auth.on('auth:login', ({ user }) => { updateUI(user);});
// ハンドラー2: アナリティクスauth.on('auth:login', ({ method }) => { analytics.track('login', { method });});
// ログイン時に両方のハンドラーが発火クリーンアップ
コンポーネントやページのアンマウント時は必ずサブスクライブを解除します:
const handlers = [ auth.on('auth:login', handleLogin), auth.on('auth:logout', handleLogout), auth.on('session:expired', handleExpired),];
// クリーンアップfunction cleanup() { handlers.forEach(unsubscribe => unsubscribe());}
// 例: ページ遷移時にクリーンアップwindow.addEventListener('beforeunload', cleanup);