DB/Supabase

[Supabase] 소셜 로그인 구현

HJ:: 2023. 8. 25. 17:09

 


진행 요약

- 리액트 tsx 환경에서 작업하였습니다.

   // Login.tsx
   ...
   <SocialLabel>간편한 소셜 로그인</SocialLabel>
          <SocialContainer>
            <OAuthLogin provider="google" />
            <OAuthLogin provider="kakao" />
            <OAuthLogin provider="github" />
          </SocialContainer>

- 반복되는 코드이기에 컴포넌트를 분리해서 사용했습니다.

 

export const sosialUserAtom = atom<string | null>(null);

type Provider = 'google' | 'kakao' | 'github';

interface OAuthLoginProps {
  provider: Provider;
}

const OAuthLogin = ({ provider }: OAuthLoginProps) => {
  const handleLogin = async () => {
    try {
      await supabase.auth.signInWithOAuth({
        provider: provider
      });

      localStorage.setItem('social', provider);
    } catch (error) {
      console.log(error);
    }
  };

-  atom 전역 상태 관리 라이브러리를 사용해준 이유는 localStorage에 어떤 소셜 로그인이 들어갔는지 알기 위해서 입니다.

- 비동기 작업이기에 async/await 구문을 사용했습니다.

- Atom은 recoil이라고도 불리며 어려운 상태 관리를 보다 쉽게 관리해줄 수 있습니다.

 

// TopBar.tsx

 // 소셜로그인
  const socialLogin = async () => {
    const user = await supabase.auth.getUser();

    // 저장된 정보에 따른 소셜로그인 데이터 가져오기
    // social === "google" | "github" | "kakao"
    const socialData = user.data.user?.identities?.filter((v) => v.provider === social);

    if (socialData !== undefined && socialData[0].identity_data && user.data.user) {
      const data = socialData[0].identity_data;

      const myUser: User = {
        email: data.email,
        id: user.data.user.id,
        nickname: data.user_name,
        profileImg: data.avatar_url
      };
      setUserData(myUser as User);
    }
  };

-  supabase 유저 정보 가져오는 함수를 발동시키고 받아온 값을

user에 저장합니다.

- 그 객체 중에서 provider가 로컬 스토리지에 저장된 소셜 값과 같을 시 

그 배열 데이터만 가져와서 필요한 값을 변수에 저장하고 랜더링 시켜줍니다.

 

...
{/* 로그인 후 */}
            {userData ? (
              <>
                <p>Hello, {userData.nickname}</p>
                <S.ProfileImg src={userData.profileImg || baseImage}></S.ProfileImg>
                <Link to={'/password_change'}>PW변경</Link>
                <S.TopBarLogButton onClick={signOutHandler}>로그아웃</S.TopBarLogButton>
                <br />
              </>
            ) :

 

 


결과 화면