概要
@authrim/web のすべての非同期メソッドは AuthResponse<T> を返します — エラー処理を型安全で一貫したものにする判別共用体です:
| { data: T; error: null }
| { data: null; error: AuthError };
SDKメソッドにtry/catchは不要です。まず error を確認してから data を使用します:
const { data, error } = await auth.passkey.login();
console.error(error.message);
// TypeScriptはここで data が non-null であると認識します
AuthError構造
/** Authrimエラーコード(例:'AR003002') */
/** OAuth 2.0エラーコード(例:'user_cancelled') */
severity: 'info' | 'warn' | 'error' | 'critical';
エラーコード形式
エラーコードは AR{ドメイン}{番号} のパターンに従います:
| プレフィックス | ドメイン | 例 |
|---|
AR001 | セッション / 認証 | セッションエラー |
AR002 | Email Code | 送信/検証エラー |
AR003 | Passkey(WebAuthn) | セレモニーエラー |
AR004 | ソーシャルログイン | プロバイダー/コールバックエラー |
AR005 | OAuth / OIDC | トークン/コールバックエラー |
重大度レベル
| レベル | 意味 | 一般的なアクション |
|---|
info | 想定内の状態(例:未認証) | 通常通りUIを更新 |
warn | 回復可能な問題(例:サイレント認証失敗) | ログして続行 |
error | 失敗した操作(例:無効なコード) | エラーメッセージを表示 |
critical | 予期しない障害(例:サーバーエラー) | エラー表示+リトライを提案 |
リトライ可能フラグ
showMessage('問題が発生しました。もう一度お試しください。');
showMessage(error.message);
// リトライを提供しない — ユーザーのアクションが必要
エラーハンドリングパターン
基本パターン
const { data, error } = await auth.passkey.login();
showErrorMessage(error.message);
エラーコードによる分岐
const { data, error } = await auth.emailCode.verify(email, code);
await auth.emailCode.send(email);
showMessage('コードの有効期限が切れました。新しいコードを送信しました。');
showMessage('コードが間違っています。もう一度お試しください。');
showMessage('試行回数が多すぎます。しばらくお待ちください。');
showMessage(error.message);
重大度ベースの処理
function handleAuthError(error: AuthError) {
switch (error.severity) {
console.log(error.message);
console.warn(`[${error.code}] ${error.message}`);
showToast(error.message, 'error');
showAlert(error.message);
リトライパターン
async function loginWithRetry(maxRetries = 2) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const { data, error } = await auth.passkey.login();
if (!error.retryable || attempt === maxRetries) {
showMessage(error.message);
await new Promise(resolve => setTimeout(resolve, 1000));
エラーコードリファレンス
Passkey(AR003xxx)
| コード | エラー | リトライ可 | 説明 |
|---|
AR003000 | passkey_error | 場合による | 一般的なPasskeyエラー |
AR003001 | webauthn_not_supported | 不可 | ブラウザがWebAuthn非対応 |
AR003002 | user_cancelled | 可 | ユーザーがセレモニーをキャンセル |
AR003003 | credential_not_found | 不可 | 一致するクレデンシャルなし |
AR003004 | authenticator_error | 可 | 認証器デバイスエラー |
AR003005 | server_validation_failed | 可 | サーバーがクレデンシャルを拒否 |
Email Code(AR002xxx)
| コード | エラー | リトライ可 | 説明 |
|---|
AR002000 | email_code_error | 場合による | 一般的なEmail Codeエラー |
AR002001 | invalid_email | 不可 | 無効なメール形式 |
AR002002 | rate_limited | 不可 | 送信リクエスト過多 |
AR002003 | code_expired | 不可 | 検証コード期限切れ |
AR002004 | invalid_code | 可 | 間違ったコード |
AR002005 | max_attempts | 不可 | 検証失敗回数超過 |
ソーシャルログイン(AR004xxx)
| コード | エラー | リトライ可 | 説明 |
|---|
AR004001 | provider_not_configured | 不可 | プロバイダー未設定 |
AR004002 | popup_blocked | 不可 | ブラウザがポップアップをブロック |
AR004003 | user_denied | 可 | ユーザーが同意を拒否 |
AR004004 | provider_error | 可 | プロバイダーがエラーを返した |
AR004005 | callback_failed | 不可 | コールバック検証失敗 |
OAuth(AR005xxx)
| コード | エラー | リトライ可 | 説明 |
|---|
AR005001 | oauth_callback_error | 不可 | コールバック処理失敗 |
AR005002 | silent_auth_failed | 不可 | サイレント認証失敗 |
AR005003 | no_tokens | 不可 | トークン未受信 |
AR005004 | popup_login_error | 可 | ポップアップログイン失敗 |
一元化されたエラーハンドラー
アプリケーション全体で再利用可能なエラーハンドラーを作成:
function handleError(error: AuthError, context: string) {
console.error(`[${context}] ${error.code}: ${error.message}`);
if (error.severity === 'critical') {
showAlert('予期しないエラーが発生しました。しばらくしてから再試行してください。');
} else if (error.severity === 'error') {
showToast(error.message);
trackError({ code: error.code, context, severity: error.severity });
const { data, error } = await auth.passkey.login();
handleError(error, 'passkey-login');
次のステップ