#8.5

세션 찾는 것은 동일한 코드로 수행된다.

⇒ lib > session.ts 파일을 만들어서 옮겨준다.

lib > session.ts

import { getIronSession } from "iron-session";
import { cookies } from "next/headers";

interface SessionContent {
    id?:number  // 로그인한 사용자에게만 id가 있기 때문에  ? 
}

export default async function getSession() {
    return getIronSession<SessionContent>(await cookies(), {
        cookieName: "delicious-carrot", 
        password: process.env.COOKIE_PASSWORD!
    })

기존, app > create-account > actions.ts 파일 수정

~~import { getIronSession } from "iron-session";
import { cookies } from "next/headers";~~
import { redirect } from "next/navigation";
import getSession from "../../lib/session";

// ...
export async function createAccount(prevState:any, formData: FormData) {
// ...
 const session = await getSession();
 // ...
}

로그인 actions.ts에 추가

  1. 이메일로 유저 찾기
  2. 사용자가 찾아졌을 때만, 비밀번호의 해시값을 확인
  3. redirect “/profile”

1. 이메일로 유저 찾기 - email이 존재하는지 zod로 확인

app > login > actions.ts

"use server";
// ...
import db from "../../lib/db"

const checkEmailExists = async (email:string) => {
  const user = await db.user.findUnique({
    where: {
      email: email
    },
    select: {
      id: true
    }
  })
  return Boolean(user)
}

const formSchema = z.object({
  email: z.string().email().toLowerCase()
        .refine(checkEmailExists, "이 이메일을 사용하는 계정이 존재하지 않습니다."),
   // ...
})
// ...