inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next.js 필수 개발 가이드 3시간 완성!

Next.js - 크레덴셜 프로바이더 설정하기(Credentials Providers)

auth 에러에 대해서

해결된 질문

614

황정연

작성한 질문수 6

1

제목: auth 해보고 있는데 오류가 나오고있네용

설명: 저는 prisma를 postgresql로 하고있습니다.

그래도 왜 이런 오류가 나오는지 원인은 잘 모르겠네요

 

내용: auth에서 credentials를 하고 있습니다.
import NextAuth from "next-auth";

import CredentialsProvider from "next-auth/providers/credentials";

import KakaoProvider from "next-auth/providers/kakao";

import NaverProvider from "next-auth/providers/naver";

import { PrismaAdapter } from "@auth/prisma-adapter";

import prisma from "@root/src/server/prisma";

import bcrypt from "bcrypt";

export const authOptions = {

providers: [

CredentialsProvider({

name: "Credentials",

credentials: {

accountId: { label: "Username", type: "text" },

password: { label: "Password", type: "password" },

email: { label: "Email", type: "email" },

name: { label: "Name", type: "text" },

},

async authorize(credentials, req) {

if (!credentials?.email || !credentials.password) {

return null;

}

const exUser = prisma.user.findUnique({

where: {

accountId: credentials.accountId as string,

email: credentials.email as string,

password: credentials.password,

name: credentials.name as string,

},

});

if (!exUser) return null;

const passwordMatch = await bcrypt.compare(

credentials.password as string,

exUser.password! // 오류 발생

);

return passwordMatch ? exUser : null;

},

}),

KakaoProvider({

clientId: process.env.KAKAO_CLIENT_ID!,

clientSecret: process.env.KAKAO_CLIENT_SECRET!,

}),

NaverProvider({

clientId: process.env.NAVER_CLIENT_ID!,

clientSecret: process.env.NAVER_CLIENT_SECRET!,

}),

],

adapter: PrismaAdapter(prisma),

};

const handler = NextAuth(authOptions); // authOptions 오류 발생

export { handler as GET, handler as POST };

 

이건 제 소스이고,
authOptions와 exUser.password! 부분에서 에러가 나오고 있는데 원인을 잘 모르겠습니다.

 

 

해당 오류입니다.

'Prisma__UserClient<{ id: string; accountId: string | null; name: string | null; email: string | null; emailVerified: Date | null; image: string | null; phone: string; password: string; role: ROLE; } | null, null, DefaultArgs>' 형식에 'password' 속성이 없습니다.ts(2339)

 

아래는 authOptions 오류입니다.

 '{ providers: (CredentialsConfig<Record<string, CredentialInput>> | OAuthConfig<KakaoProfile> | OAuthConfig<...>)[]; adapter: Adapter; }' 형식의 인수는 'NextAuthConfig' 형식의 매개 변수에 할당될 수 없습니다.
'adapter.linkAccount'의 형식은 해당 형식 간에 호환되지 않습니다.
'((account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@aut...' 형식은 '((account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<...>) | undefined' 형식에 할당할 수 없습니다.
'(account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth...' 형식은 '(account: import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount) => Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<...>' 형식에 할당할 수 없습니다.
'Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/@auth/core/adapters").AdapterAccount | null | undefined>' 형식은 'Promise<void> | import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/types").Awaitable<import("/Users/hwangjeong-yeon/workspace/Project/FOCC/focc/node_modules/next-auth/node_modules/@auth/core/adapters").AdapterAccount | null | undefined>' 형식에 할당할 수 없습니다.
'AdapterAccount' 형식은 'Promise<void> | Awaitable<AdapterAccount | null | undefined>' 형식에 할당할 수 없습니다.
'AdapterAccount' 형식에 'Promise<void>' 형식의 then, catch, finally, [Symbol.toStringTag] 속성이 없습니다.ts(2345)

const authOptions: {
providers: (CredentialsConfig<Record<string, CredentialInput>> | OAuthConfig<KakaoProfile> | OAuthConfig<...>)[];
adapter: Adapter;
}

혹시 제가 schema 부분에서 오류가 있을까요?

 

model User {

id String @id @default(cuid())

accountId String?

name String?

email String? @unique

emailVerified DateTime?

image String?

phone String @default("")

password String @default("")

role ROLE @default(USER)

accounts Account[]

sessions Session[]

typescript next.js auth

답변 2

1

Su

안녕하세요 정연님 질문 주셔서 감사합니다! 실례지만 전체 소스코드가 있어야 확실하게 답변해 드릴 수 있을 것 같습니다.

우선 제출해주신 코드를 분석하자면 다음과 같습니다:
1. exUser.password! 오류:

- 오류 메시지에 따르면, 'Prisma__UserClient<...>' 형식에 'password' 속성이 없습니다.라고 나타나고 있습니다. 이는 prisma.user.findUnique({...}) 호출이 반환하는 객체에 password 속성이 없다는 것을 의미합니다.

- Prisma의 findUnique 메소드는 기본적으로 모든 필드를 가져오지 않습니다. 특정 필드를 명시적으로 선택해야 합니다. selectinclude 옵션을 사용하여 password 필드를 가져오도록 수정해야 합니다.

- 예를 들어:

const exUser = await prisma.user.findUnique({
  where: {
    accountId: credentials.accountId as string,
    // 다른 조건들...
  },
  select: {
    password: true,
    // 다른 필요한 필드들...
  }
});

2. authOptions 오류:

- 오류 메시지는 authOptions 객체가 'NextAuthConfig' 형식의 매개변수에 할당될 수 없다고 나타내고 있습니다. 이는 NextAuthPrismaAdapter 간의 호환성 문제로 보입니다.

- 이 문제는 종종 버전 차이 또는 잘못된 타입 정의로 인해 발생할 수 있습니다. 사용 중인 next-auth@auth/prisma-adapter의 버전이 호환되는지 확인하세요.

- 필요한 경우, 라이브러리의 최신 버전으로 업데이트하거나, 호환되는 버전 조합을 찾아야 합니다.

- 또한, PrismaAdapter(prisma) 호출이 올바르게 adapter 필드에 할당되고 있는지 확인하세요.

3. Prisma 스키마:

- Prisma 스키마에는 password 필드가 정의되어 있으며, 기본값이 설정되어 있습니다 (`@default("")`). 이는 비밀번호 필드가 항상 존재함을 의미합니다.

- accountId, email, name 필드는 선택적(`?`)으로 정의되어 있으며, 이는 해당 필드가 null일 수도 있음을 의미합니다.

- findUnique 쿼리에서 이러한 필드들을 올바르게 사용하고 있는지 확인하세요. 선택적 필드는 null일 수 있으므로, 쿼리 조건에서 이를 고려해야 합니다.

이러한 수정을 통해 오류를 해결할 수 있을 것입니다. 오류 메시지를 꼼꼼히 읽고, 필요한 필드가 쿼리에 포함되어 있는지, 사용하는 라이브러리의 버전이 호환되는지 확인하는 것이 중요합니다. 참고해주세요!!

0

황정연

제 질문이 너무 허접했었지만 친절한 답변 감사합니다
덕분에 에러 해결과 궁금증이 해소되었습니다.

감사합니다

0

Su

정연님, 귀하의 질문은 정말 가치 있었습니다! 수강해 주셔서 대단히 감사드립니다. 궁금한 점이 있으시면 언제든지 편하게 질문해 주세요!!

호두 AI님 강의 차이점에 대해 문의 드립니다.

0

6

1

마감 인 경우.

0

7

1

모든 ts파일이 컴파일 되지 않습니다.(해결됨.)

0

8

3

버셀로 서버 배포 후 접속 시 500 에러 발생

0

20

2

5장부터는 미션 상세 내용이 없는데 어떻게 작성해야되나요?

0

23

1

레퍼런스 사이트를 참고하여 메인페이지 초안만들기 (2:04) 여기에서 막혔어요.

0

29

2

네이버증권 데이터 크롤링 불법?

0

54

2

플러터 세팅 후 새폴더 생성건

0

35

1

수강신청 완료했습니다.

1

46

2

3,4장 이후 미션 제출 질문

0

43

2

강의자료

0

37

1

강의자료는 어떻게 제작하시나요?

0

47

2

비밀번호 재설정 1회용 이메일 링크

0

51

1

컴포넌트와 레이아웃

0

42

2

claude-squad 실행 시 로그인 및 권한 문제

0

42

2

강의 수강 후 포트폴리오 준비 방향에 대해 조언 부탁드립니다.

2

64

1

@/styles/globals.css'

0

44

2

62강 노션 링크 사용권한 승인 부탁드립니다.

0

31

2

62강 노션 링크 사용권한 승인 부탁드립니다.

0

29

1

PROJECT_STRUCTURE.md 파일 공유좀 해주세요

0

39

2

노션 사용권한 불편합니다.

0

37

2

소스 코드

1

335

1

SSR CSR

0

549

1

Dynamic Routes GET 메소드 만들기 질문 있습니다!

1

261

1