본문 바로가기
내일배움캠프 TIL

2024-01-05 본 캠프 66일차 / 85일차 TIL (auth trigger 함수 구현 및 yarn run dev 시 문제 발생)

by KMS_99 2024. 1. 8.

2024-01-05 본 캠프 65일차 / 85일차 TIL

주요진행사항

- supabase 로그인 로직 구현 (trigger)

- react-hook-form 이용 

 

supabase 로그인 로직 구현 (trigger)

trigger 함수를 통해 supabase auth에 유저를 생성 하면, 추가 정보를 담은 row를 users table에 추가하는 로직을 구성하였다.

trigger 함수를 구성하기 위해 다음과 같이 eql 명령어를 만들었다.

 

create
or replace function public.handle_new_user () returns trigger
set
  search_path = public as $$
BEGIN
  IF new.raw_app_meta_data->>'provider' = 'email' THEN
    INSERT INTO public.users (id, display_name, created_at, email)
    VALUES (new.id, coalesce(new.raw_user_meta_data->>'display_name', 'Unknown'), NOW(), new.email)
    ON CONFLICT (id) DO UPDATE SET display_name = EXCLUDED.display_name, created_at = EXCLUDED.created_at, email = EXCLUDED.email;
  ELSE
    INSERT INTO public.users (id, display_name, created_at, email)
    VALUES (new.id, coalesce(new.raw_user_meta_data->>'full_name', 'Unknown'), NOW(), new.email)
    ON CONFLICT (id) DO UPDATE SET display_name = EXCLUDED.display_name, created_at = EXCLUDED.created_at, email = EXCLUDED.email;
  END IF;
  RETURN NEW;
END
$$ language plpgsql;

CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE PROCEDURE public.handle_new_user();

 

if 문을 통해서 provider가 email일 때, 즉 일반 로그인을 실시할 때와 아닐 때(oAuth)를 trigger 함수가 일어날 떄 meta_data의 provider 속성을 통해 구분하였다.

oAuth와 일반로그인 시 저장하는 데이터의 모양이 다르기 때문에 구분하여 분리하였다.

로직을 마쳤으면 Create Trigger를 통해 트리거 함수를 만든다.

 

로직 구현간 문제사항

- trigger function 구현 간 security definer 세팅 문제

 

로직이 완전한 다음 트리거를 만들고 실행했을 때 오류가 발생하였다.

오류의 내용은 테이블 insert하는 권한이 없다는 내용이였다.

 

해당 오류는 회원가입시 실행되는 trigger함수는 테이블에 어떠한 권한도 가지고 있지 않기에 나타나였어.

다음 코드의 security definer를 통해 인증되지 않은 사용자에게도 권한을 부여할 수 있었다.

 

create
or replace function public.handle_new_user () returns trigger security definer