Next.js Discord

Discord Forum

problem with lucia auth

Unanswered
Bombay posted this in #help-forum
Open in Discord
BombayOP

4 Replies

BombayOP
import { cookies } from "next/headers";
import { cache } from "react";
import { lucia } from "#/lib/auth/lucia";
import { UserSessionData } from "#/types/lucia";

async function fetchUserSessionData(
  rawSessionId?: string
): Promise<UserSessionData | null> {
  const cookieStore = await cookies();
  const session_id =
    rawSessionId ?? cookieStore.get(lucia.sessionCookieName)?.value;
  console.log({ session_id });
  if (!session_id) {
    return null;
  }

  const result = await lucia.validateSession(session_id);
  console.log({ result });
  if (result.session && result.session.fresh) {
    const sessionCookie = lucia.createSessionCookie(result.session.id);
    cookieStore.set(
      sessionCookie.name,
      sessionCookie.value,
      sessionCookie.attributes
    );
  }

  if (!result.session) {
    const sessionCookie = lucia.createBlankSessionCookie();
    cookieStore.set(
      sessionCookie.name,
      sessionCookie.value,
      sessionCookie.attributes
    );
  }

  if (!result.user || !result.session) {
    return null;
  }

  return result;
}

export const getUserSessionData = cache(fetchUserSessionData);
"use server";

import { compareSync } from "bcryptjs";
import { cookies } from "next/headers";
import { z } from "zod";
import { lucia } from "#/lib/auth/lucia";
import { SignInSchema } from "#/lib/auth/schemas";
import { userModel } from "#/database";

export async function signIn(data: z.infer<typeof SignInSchema>) {
  const values = SignInSchema.safeParse(data);
  if (!values.success) {
    throw new Error("Cannot signin, bad data provided");
  }

  const user = await userModel.findOne({ email: values.data.email });
  if (!user) {
    throw new Error("Cannot signin, user not found");
  }

  const isPasswordVerified = compareSync(data.password, user.password);
  if (!isPasswordVerified) {
    throw new Error("Cannot signin, bad password");
  }

  const session = await lucia.createSession(user.id, {});
  const sessionCookie = lucia.createSessionCookie(session.id);

  const cookieStore = await cookies();
  cookieStore.set(
    sessionCookie.name,
    sessionCookie.value,
    sessionCookie.attributes
  );

  return { signedIn: true };
}
what happens is that right after it is created, there is something not in the cookies(?) but in the database and when validating always is null
import { Lucia, TimeSpan } from "lucia";
import { adapter } from "#/database/index";

export const lucia = new Lucia(adapter, {
  sessionExpiresIn: new TimeSpan(1, "d"),
  sessionCookie: {
    expires: false,
    attributes: {
      secure: process.env.NODE_ENV === "production",
    },
  },

  getUserAttributes: (attributes) => {
    return {
      email: attributes.email,
      firstName: attributes.firstName,
      lastName: attributes.lastName,
      createdAt: attributes.createdAt,
      updatedAt: attributes.updatedAt,
      activated: attributes.activated,
    };
  },
});