authjs를 사용하여 소셜 로그인이 아닌 현재 구축하고 있는 앱만의 로그인 시스템을 구축해보자.
bcrypt
모듈을 다운로드 한다.npm install bcrypt
npm install -D @types/bcrypt
hashedPassword
라는 필드를 추가해야 한다.prisma/schema.prisma
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
image String?
hashedPassword String?
accounts Account[]
sessions Session[]
}
npx prisma migrate dev
app/api/auth/[…nextauth]/route.ts
...
import CredentialsProvider from "next-auth/providers/credentials";
import bcrypt from "bcrypt";
export const authOptions = {
...
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
email: { label: "Email", type: "email", placeholder: "Email" },
password: {
label: "Password",
type: "password",
placeholder: "password",
},
},
async authorize(credentials, req) {
// credentials 인자 값을 통해 사용자가 입력한 이메일, 패스워드 추출
if (!credentials?.email || !credentials?.password) return null;
// 사용자 존재 여부 확인
const user = await prisma.user.findUnique({
where: { email: credentials.email },
});
// 사용자가 없으면 null 리턴
if (!user) return null;
// 데이터베이스의 암호화된 비밀번호와 사용자가 입력한 비밀번호가 같은지 비교
const passwordMatch = await bcrypt.compare(
credentials.password,
user.hashedPassword!
);
// 비밀번호가 일치하면 사용자 리턴
return passwordMatch ? user : null;
},
}),
...
};
const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };