Zenn
🍣

supabase auth hooks で Supabase 認証情報とアプリケーションの User テーブルをリンクさせる。

2025/01/01に公開

状況

最近、Supabase で認証機能を実装していたんですが、認証情報(auth.users)とアプリケーションで使用するユーザー情報(User テーブル)を連携させる必要が出てきました。
毎回手動で連携させるのは面倒だし、ミスの元なので、自動化する方法を探してみました。

どうやって解決するの?

Supabase には「Auth Hooks」という便利な機能があって、これを使うと認証時の処理を自動化できます。
具体的には、新しいユーザーが登録されたときに自動的に User テーブルにもレコードを作成する、といった感じです。

実装方法

SQL Editor で以下のコードを実行します:

-- カスタムアクセストークンフック関数の作成
create or replace function public.handle_new_user()
returns trigger as $$
begin
  -- [INFO] 新規ユーザー登録イベントのログ出力
  raise log '[INFO] New auth.user registered: %', new.id;

  -- userテーブルにレコードを作成
  insert into public."User" (id, name, role)
  values (
    new.id,
    new.raw_user_meta_data->>'name',  -- メタデータから名前を取得
    'USER'  -- デフォルトロール
  );

  -- [INFO] userテーブルへの登録完了ログ
  raise log '[INFO] Created corresponding record in public."User" for auth.user: %', new.id;

  return new;
end;
$$ language plpgsql security definer;

-- トリガーの作成
create or replace trigger on_auth_user_created
    after insert on auth.users
    for each row execute procedure public.handle_new_user();

カスタマイズするときの注意点

このコードをそのまま使うと動かない可能性が高いので、以下の部分は自分の環境に合わせて変更する必要があります:

  1. テーブル名

    • public."User"という部分は、自分のアプリで使っているテーブル名に変更してください
    • 例:public.usersとかpublic.profilesとか
  2. カラム名

    • id, name, roleの部分は、自分のテーブルのカラムに合わせて変更が必要です
    • 必要なカラムを追加したり、不要なカラムを削除したりしてください
  3. メタデータの取得方法

    • new.raw_user_meta_data->>'name'の部分は、認証時に送信するデータに応じて変更します
    • メタデータを使わない場合はnew.emailとかでも大丈夫です
  4. デフォルト値

    • 'USER'という部分は、自分のアプリの権限設計に合わせて変更してください
    • 例:'NORMAL'とか'GENERAL'とか

ハマりポイント

  1. メタデータが取得できない

    • クライアント側でメタデータを送信し忘れていないか確認
    • 送信しているデータのキー名が合っているか確認
  2. トリガーが発火しない

    • SQL 実行時にエラーが出ていないか確認
    • 実際にユーザー登録してみて、ログを確認

まとめ

Auth Hooks を使うと、認証情報とアプリのユーザー情報を簡単に連携できます。
最初は設定が面倒くさそうに見えますが、一度設定してしまえば後は自動で連携してくれるので、かなり便利ですよ!

参考にしたサイト

Discussion

ログインするとコメントできます