エラーの概要
Supabaseの422エラーは「Unprocessable Entity」を意味し、リクエストの構文は正しいものの、サーバーがデータの検証ルール違反を検出したときに発生します。Supabaseの認証(Auth)機能では、パスワードやメールアドレスの形式チェック、カスタムSMTP設定の検証で特に頻繁に見られます。このエラーが返されると、ユーザー登録やパスワード変更などの認証処理が失敗します。
実際のエラーメッセージ例
Supabase JavaScriptクライアントから返されるエラーレスポンス:
{
"error": "invalid_grant",
"error_description": "Invalid login credentials",
"status": 422
}
またはREST APIを直接呼び出した場合:
{
"code": "422",
"message": "Validation failed",
"details": "Password should be at least 6 characters"
}
よくある原因と解決手順
原因1:パスワードが最低文字数を満たしていない
Supabaseのデフォルト設定では、パスワードは最低6文字以上である必要があります。これより短いパスワードでユーザー登録やパスワード変更を試みると、422エラーが返されます。ユーザー入力の検証を行わずにAPIに送信している場合に発生することが多いです。
Before(エラーが起きるコード):
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: '12345' // 5文字 - 最低要件を満たさない
});
if (error) {
console.error('422エラー:', error.message);
}
After(修正後):
const password = 'secure_password_123'; // 6文字以上
if (password.length < 6) {
console.error('パスワードは最低6文字以上である必要があります');
return;
}
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: password
});
if (error) {
console.error('認証エラー:', error.message);
}
原因2:メールアドレスの形式が不正
Supabaseは送信前にメールアドレス形式を厳密に検証します。スペースが含まれている、@記号が複数ある、ドメイン部分が不完全など、RFC 5322標準から外れたアドレス形式では422エラーが発生します。ユーザー入力を整形せずに送信している場合や、テストデータに誤りがある場合に多く見られます。
Before(エラーが起きるコード):
const email = 'user @example.com'; // スペースを含む不正な形式
const { data, error } = await supabase.auth.signUp({
email: email,
password: 'secure_password_123'
});
if (error) {
console.error('422エラー:', error.message);
}
After(修正後):
const email = 'user@example.com'.trim().toLowerCase(); // 前後のスペース削除と小文字化
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
console.error('メールアドレス形式が不正です');
return;
}
const { data, error } = await supabase.auth.signUp({
email: email,
password: 'secure_password_123'
});
if (error) {
console.error('認証エラー:', error.message);
}
原因3:Supabase AuthのカスタムSMTP設定またはメールテンプレート設定に問題がある
Supabase Dashboardでカスタムメールプロバイダー(SendGrid、Mailgun等)を設定した場合、認証情報の誤り、テンプレート変数の不一致、またはメール送信設定の検証ルール違反で422エラーが発生することがあります。特に環境変数の値が不完全であったり、テンプレート内の変数が不正な形式である場合に顕著です。
Before(エラーが起きるコード):
# Supabase Authのカスタムメール設定(不正な例)
SMTP_HOST: smtp.gmail.com
SMTP_PORT: 587
SMTP_USER: <incomplete-email> # 値が不完全
SMTP_PASS:
# パスワードが空
SMTP_FROM_EMAIL: noreply@example.com
SMTP_FROM_NAME: MyApp
# メールテンプレートの確認漏れ
# パスワードリセットテンプレートに {{ .ConfirmationURL }} が含まれていない
After(修正後):
# 修正後のカスタムメール設定(正規の例)
SMTP_HOST: smtp.gmail.com
SMTP_PORT: 587
SMTP_USER: your-email@gmail.com
SMTP_PASS: your-app-password # App PasswordまたはOAuth認証を使用
SMTP_FROM_EMAIL: noreply@example.com
SMTP_FROM_NAME: MyApp
# メールテンプレートの例(確認メールテンプレート)
# メール本文に必須変数 {{ .ConfirmationURL }} を含める
<h1>メール認証</h1>
<p>以下のリンクをクリックして認証を完了してください。</p>
<a href="{{ .ConfirmationURL }}">認証リンク</a>
またはJavaScriptでメール検証設定を確認する場合:
// Supabaseクライアント初期化時に認証設定を確認
const supabase = createClient(
'<your-project-url>',
'<your-anon-key>',
{
auth: {
autoRefreshToken: true,
persistSession: true,
// メールプロバイダーが正しく設定されているか確認
}
}
);
// ユーザー登録前にメール設定の妥当性をチェック
const { data, error } = await supabase.auth.signUp({
email: 'test@example.com',
password: 'valid_password_123'
// ここでエラーが返される場合、Dashboard設定を再確認
});
ツール固有の注意点
Supabaseの422エラーはプロジェクト設定の違いで挙動が異なります。以下の点を確認してください。
Authentication > Providers > メール設定の確認: Supabase Dashboardの「Authentication」→「Providers」→「Email」で、以下の項目を確認しましょう。
- 「Confirm email」が有効になっている場合、メールアドレス形式の検証がより厳密になります。
- 「Double confirm change」を有効にしている場合、メール変更時の追加検証が動作します。
カスタムSMTP vs Supabase標準メール: Supabaseの標準メール機能を使用している場合、制限が異なります。SendGridやMailgunなどを統合している場合は、各プロバイダー側の検証ルールも確認が必要です。
パスワードポリシーの設定: Supabase Dashboardの「Authentication」→「Policies」で、パスワードの最小文字数、複雑性要件、有効期限などをカスタマイズできます。デフォルトより厳しい設定にしている場合は、そのルールに合わせたバリデーションをフロントエンドに実装してください。
// ダッシュボード設定に基づいてバリデーション関数を作成
const validatePassword = (password) => {
const minLength = 6; // デフォルト設定
const hasNumber = /\d/.test(password);
const hasSpecialChar = /[!@#$%^&*]/.test(password);
if (password.length < minLength) {
return { valid: false, message: `最低${minLength}文字必要です` };
}
// カスタムポリシーに合わせて条件を追加
return { valid: true };
};
それでも解決しない場合
Supabase Logsの確認:
Supabase Dashboardの「Logs」セクションで、リアルタイムのエラーログを確認できます。Status: 422でフィルタリングすると、詳細なエラーメッセージが表示されます。
REST APIでの詳細なデバッグ:
# curlコマンドでメール検証エラーの詳細を確認
curl -X POST 'https://<your-project-ref>.supabase.co/auth/v1/signup' \
-H 'apikey: <your-anon-key>' \
-H 'Content-Type: application/json' \
-d '{
"email": "test@example.com",
"password": "short"
}' \
-w '\nStatus: %{http_code}\n'
# レスポンスに詳細なエラー理由が含まれます
公式リソースへのアクセス:
プロジェクト設定やAPIキーに関わる部分は、Supabaseサポートに直接問い合わせることも有効です。Dashboardの「Help」→「Support」から公式サポートチャネルにアクセスできます。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。