[NextAuth] NextAuth로 로그인 구현하기 - 4 (Credentials 추가사항)

임홍원·2024년 1월 12일
1

NextAuth

목록 보기
4/5
post-thumbnail

지난번 Credentials에 이어 Supabase와 연동하여 로그인을 진행하는 과정에서 에러가 발생하였고,
이 에러를 해결한 방법을 소개하고자 한다.

우선 코드 먼저 살펴보자

에러 발생 코드

async authorize(credentials, req) {
        if(!credentials) {
          throw new Error('입력 값이 잘못되었습니다.')
        }
        // supabase에서 데이터 가져와서 객체를 만든 후 return
        const repositoryEmail = await supabase.from('company_user').select('email, name ').eq('email', `${credentials?.email}`);
        const email = repositoryEmail.data


        console.log(email);
        return email;
      },

우선 에러가 발생한 코드의 이유로는 데이터 타입의 문제였다.
authroize 함수에서 return 하는 데이터는 객체여야 하는데 supabase의 data는 배열로 들어오기 때문에 또 따로 가공을 해 주어야 한다.

에러 해결 코드

async authorize(credentials, req) {
        if (!credentials) {
          throw new Error('입력 값이 잘못되었습니다.');
        }
        // supabase에서 데이터 가져와서 객체를 만든 후 return
        const repositoryEmail = await supabase
          .from('company_user')
          .select('email, name ')
          .eq('email', `${credentials?.email}`);
				// 추가 된 부분
        const email = JSON.stringify(repositoryEmail.data?.[0]);

        console.log(email);
        if (email) {
          return {
            id: email,
            email: email,
            name: this.name,
          };
        }
        return null;
      },

email을 가져올때 배열 안의 데이터가 [ { email: 'test@test.com', name: 'name'}] 이런식으로 가져와지기 때문에 0번째 인덱스를 사용하였다.

2024 / 01 / 15 추가사항
.single() 메서드로 데이터를 가져오게되면 인덱스를 사용하지 않아도 된다.

email, name 등등 필요한 정보를 supabase single 쿼리로 가져올 수 있지만 그렇게하면 코드가 너무 길어져 가독성이 떨어질 거 같아 이 방법을 사용하였다.

응용 코드

async authorize(credentials, req) {
        if (!credentials) {
          throw new Error('입력 값이 잘못되었습니다.');
        }
        // supabase에서 데이터 가져와서 객체를 만든 후 return
        const companyUser = await supabase
          .from('company_user')
          .select('*')
          .eq('email', `${credentials?.email}`);

        const userData = companyUser.data?.[0];

        if (userData?.password !== credentials?.password) {
          throw new Error('비밀번호가 다릅니다.');
        }

        return {
          id: userData.id,
          email: userData.email,
          name: userData.name,
          image: null,
        };
      },

id를 넣어주지 않으면 다시 타입에러가 발생하므로 id 값은 필수적으로 넣어주어야 한다.

0개의 댓글