🍣
supabase auth hooks で Supabase 認証情報とアプリケーションの User テーブルをリンクさせる。
状況
最近、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();
カスタマイズするときの注意点
このコードをそのまま使うと動かない可能性が高いので、以下の部分は自分の環境に合わせて変更する必要があります:
-
テーブル名
-
public."User"
という部分は、自分のアプリで使っているテーブル名に変更してください - 例:
public.users
とかpublic.profiles
とか
-
-
カラム名
-
id, name, role
の部分は、自分のテーブルのカラムに合わせて変更が必要です - 必要なカラムを追加したり、不要なカラムを削除したりしてください
-
-
メタデータの取得方法
-
new.raw_user_meta_data->>'name'
の部分は、認証時に送信するデータに応じて変更します - メタデータを使わない場合は
new.email
とかでも大丈夫です
-
-
デフォルト値
-
'USER'
という部分は、自分のアプリの権限設計に合わせて変更してください - 例:
'NORMAL'
とか'GENERAL'
とか
-
ハマりポイント
-
メタデータが取得できない
- クライアント側でメタデータを送信し忘れていないか確認
- 送信しているデータのキー名が合っているか確認
-
トリガーが発火しない
- SQL 実行時にエラーが出ていないか確認
- 実際にユーザー登録してみて、ログを確認
まとめ
Auth Hooks を使うと、認証情報とアプリのユーザー情報を簡単に連携できます。
最初は設定が面倒くさそうに見えますが、一度設定してしまえば後は自動で連携してくれるので、かなり便利ですよ!
Discussion