Lovable、Bolt、v0、またはCursorでアプリを構築しました。プレビューでは完全に動作していました。デプロイし、ライブURLを開いたところ、画面の半分が空になるか、次のような表示が出ました:
permission denied for table profiles
code: 42501
Enter fullscreen mode Exit fullscreen mode
またはデータがnullとして読み込まれ、コンソールにgetUser()が何も返さないと表示されます。イライラする点は、動作していたプレビューと動作しなくなったデプロイの間でコードに何も変更がないことです。では何が起こったのでしょうか?
AIで構築したアプリでほぼ必ず発生する理由
これは私たちが最もよく見る失敗の一つであり、ランダムなものではありません。AIアプリビルダーはフロントエンドを素早く生成しますが、アプリとデータベースの間のセキュリティ境界を中途半端なままにすることがよくあります。通常、同時に2つのことが当てはまります:
Row Level Security(RLS)が有効になっています。SupabaseはRLSを有効にしているため、テーブルは適切なユーザーのみが読み書きできます。これは正しく、望ましい動作です。ポリシーにはおそらく「
auth.uid() = user_idのときに行が表示される」といった内容が設定されています。本番環境でSupabaseに到達するリクエストが匿名です。ビルダーのプレビューでは、リクエストがセッションを保持していたり、昇格されたアクセス権で実行されていたため、RLSがリクエストを通過させていました。本番デプロイでは、サーバーがログインユーザーのIDを付与せずにSupabaseを呼び出しています。そのため
auth.uid()がnullとなり、ポリシーが一致せず、Supabaseは正しく42501 permission deniedを返します。
平易に言うと:セキュリティルールは機能していますが、アプリがIDを示さずにドアをノックしている状態です。
問題の確認方法
何かを変更する前に、正確なエラーテキストを保持してください。その後、順番に確認します:
- 問題のテーブルでRLSが有効になっていますか?Supabaseでテーブルを開き、ポリシーを確認してください。RLSが有効でクエリに一致するポリシーがない場合、すべての読み書きが失敗します。
- サーバー上のリクエストは認証されていますか?クエリを実行するサーバールートにログを追加し、ユーザー情報を持っているかを出力してください。nullまたはanonymousと表示された場合、それが原因です。
- 環境変数は失敗したSupabaseプロジェクトを正しく指していますか?間違ったプロジェクトを指したデプロイや、
SUPABASE_URLとanonキーの欠落は同じ症状を引き起こします。 - 認証のリダイレクトURLに本番ドメインが含まれていますか?SupabaseのAuth設定で、サイトURLとリダイレクト許可リストに本番ドメインを含める必要があります(localhostだけでなく)。
修正方法
本当の修正は、リクエストにユーザーのIDを保持させ、RLSがチェックする際にauth.uid()が設定されるようにすることです。Next.jsとSupabaseのアプリでは、通常以下を意味します:
- 保護されたテーブルにアクセスするサーバールートやアクションでは、匿名クライアントではなく、認証クッキーを読み取るリクエストスコープのサーバークライアントを使用します。
- 本番ドメイン上でのナビゲーションやハードリフレッシュ後もクッキーが有効に保たれるよう、ミドルウェアでセッションを更新します。
- RLSポリシーが実際のアクセスパターンと一致することを確認します。ユーザーが自分の行を表示できるようにする場合、ポリシーは
auth.uid()を行のユーザー列と比較します。これを「修正」するためにRLSを無効にしないでください。 - Supabase AuthのリダイレクトURLに本番ドメインを追加し、ライブURLでログイン、ページ読み込み、ハードリフレッシュのフルパスを再テストします。
その後、失敗したユーザーアクションを正確に再実行し、同じSupabaseプロジェクトとドメインに対して動作することを確認してください。
注意事項
エラーを消すためにRLSを無効にしたり、サービスロールキーをブラウザで使用したりする安易な近道は魅力的です。絶対にやめてください。RLSを無効にすると、そのテーブルのすべての行がインターネット上の誰からも読み書き可能になり、サービスロールキーをクライアントコードに配置すると、見知らぬ者にデータベースの完全な制御を渡すことになります。エラーは煩わしいですが、それはあなたを守っているのです。
行き詰まった場合、または技術的でない場合
技術者でない場合、これが外国語のように読めるのは普通のことです。これはまさに、auth、データベース、デプロイの境界に存在するため、AIビルダーがあなたのために完了できない種類の問題です。
私たちはVibe-Code Rescueというこのためのサービスを運営しています。エラーを貼り付けると、何が間違っているか、何を修正する必要があるかの無料で平易な診断を受けられます。修正を希望する場合、定額料金で、修正が動作確認された後にのみお支払いいただき、所有するクリーンなコードが残ります。サブスクリプションやリテーナーはありません。
無料診断はこちら:https://rescue.ticassociation.com
A TIC Association creation.
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.