본문 바로가기
웹 도구 제작 노트

수파베이스 구글 로그인/회원가입시 테이블에 데이터 추가

by 크랜베리 Ai. 2024. 11. 10.

간단 설명

수파베이스 구글 로그인/회원가입시 테이블에 데이터 추가

상세 설명

Supabase에서 auth.users와 사용자 정의 테이블인 Profile은 서로 다른 역할을 수행합니다.

  1. auth.users 테이블
    • 역할: Supabase Auth가 자동으로 관리하는 테이블로, 기본적인 인증 정보를 저장합니다.
    • 내용: 사용자 ID, 이메일, 생성 날짜, 업데이트 날짜와 같은 인증 정보가 포함됩니다.
    • 사용 목적: 사용자 로그인 및 인증 관련 작업을 위한 시스템 테이블입니다.
    • 수정 제한: Supabase가 관리하므로 직접 수정하거나 필드를 변경하지 않는 것이 좋습니다.
  2. Profile 테이블 
    • 역할: 애플리케이션에서 필요한 추가적인 사용자 정보를 저장하기 위한 테이블입니다.
    • 내용: 사용자 이름, 프로필 사진, 소개 등 앱에서 활용되는 확장된 프로필 정보가 포함됩니다.
    • 사용 목적: 사용자 프로필 표시, 커스터마이징된 정보 저장, RLS 규칙 설정 등에 활용됩니다.
    • 수정 가능: 개발자가 필드를 자유롭게 수정하거나 추가할 수 있습니다.

auth.usersProfile의 구분 이유

  • 인증과 사용자 데이터의 분리: auth.users는 기본적인 인증 정보만을 관리하고, Profile은 앱에서 요구하는 추가 정보를 관리합니다.
  • 확장성과 제어 용이성: auth.users는 Supabase에서 관리하여 제한이 있는 반면, Profile은 개발자가 제어할 수 있어 다양한 RLS 규칙을 적용하거나 데이터를 커스터마이징하기 좋습니다.

결론적으로, auth.users로 인증을 처리하고 Profile 테이블로 사용자 정보를 관리하는 것이 일반적인 접근 방식입니다.

 

테이블 예

CREATE TABLE "Profile" (
  "id" UUID PRIMARY KEY REFERENCES auth.users (id) ON DELETE CASCADE, -- auth.users 의 id 와 동일
  "email" VARCHAR(255) UNIQUE NOT NULL,
  "name" VARCHAR(255) DEFAULT '',
  "avatarUrl" VARCHAR(255) DEFAULT '',
  "date" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
  "grade" VARCHAR(255) DEFAULT 'free' -- free (1), basic (10), premium (25), vip (40)
);

 

트리거 예

--[Next, Supabase Auth] 이메일, 소셜 로그인 기능 구현 및 트리거 설정
--https://mingos-habitat.tistory.com/108
--Your trigger function must be security definer type as shown in the User Management starter template in the SQL editor, or in most of the starter guides.
--https://github.com/supabase/supabase/issues/17186
--[supabase] trigger/function 조건부로 작성하기
--https://velog.io/@_soul_/supabase-triggerfunction-%EC%A1%B0%EA%B1%B4%EB%B6%80%EB%A1%9C-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0
--User Management | Supabase Docs
--https://supabase.com/docs/guides/auth/managing-user-data

--DROP TRIGGER IF EXISTS "on_auth_user_created" ON auth.users;
--DROP FUNCTION insert_profile;

CREATE OR REPLACE FUNCTION insert_profile()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.raw_app_meta_data ->> 'provider' = 'google' THEN
        INSERT INTO
          public."Profile" ("id", "email", "name", "avatarUrl", "grade")
        VALUES
          (
            NEW.id,
            NEW.email,
            NEW.raw_user_meta_data ->> 'name',
            NEW.raw_user_meta_data ->> 'avatar_url',
            'free'
          );
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql security definer;

CREATE TRIGGER "on_auth_user_created"
AFTER INSERT ON auth.users
FOR EACH ROW 
EXECUTE FUNCTION insert_profile();

 

정책 예

select: 로그인 사용자

--Profile

create policy "Enable select for users based on userId"
on "public"."Profile"
for select
using (
  (select auth.uid()) = "id"
);

create policy "Enable update for users based on userId"
on "public"."Profile"
for update 
using (
  (select auth.uid()) = "id"
);

--정책 추가 않된 경우 디폴트 Enable read access for authenticated
ALTER TABLE "Profile"
ENABLE ROW LEVEL SECURITY;

 

수파베이스 구글 로그인 설정
https://automatethem.tistory.com/293

Sns

https://automatethem.tistory.com/366

 

https://blog.naver.com/automatethem/223654729981

 

https://automate-them.blogspot.com/2024/11/blog-post_92.html

관리

https://github.com/automatethem-prod-web/navbar-menu-sidepanel-login-web-app

 

https://github.com/automatethem-prod-web/navbar-menu-sidepanel-login-user-dropdown-web-app

반응형