SupabaseでOAuthログインしたらINSERTでつまづいた


困った

ログインするときにメールアドレスとパスワードの組み合わせを使うパターンを作ったのですが、追加でOAuthのパターンも作りました。作ったのは良いのですが、テーブルにデータを入れる際、new row violates row-level security policyと出て6時間くらい右往左往しました。というわけでここに供養と備忘録を兼ねて書いておこうと思います。

原因

テーブルには以下のRLSを設定していました。よくある、自分しか見れないし、自分しかデータを入れられないようにする設定ですね。

create policy "User can select their own peer."
  on public.peers for select
  using (  user_id = auth.uid()  );

create policy "Users can insert their own peer."
  on public.peers for insert
  with check ( user_id = auth.uid() );

調べると、Supabaseにログインしたのにログインしていない状況でした。な、何を言っているのかわからねーと思うが、私もわかりませんでした。
OAuthのログインではクライアント側のsupabaseClientを使ったのに対し、テーブルにINSERTする際にはサーバー側のsupabaseClientを使ったのが原因でした。そりゃあそうなるよなって話なんですが、なんでこうなったかと言うと、メールアドレスとパスワードの組み合わせログインはサーバー側でやっていたので、それに引きずられてしまったんですね。クライアント側のsupabaseClientを使ってINSERTすれば、特になんの問題もなく動きました。
OAuthとの併用を考えると、メールアドレスで登録する方もクライアント側でやったほうが良いのかもしれません。
現場からは以上です。