错误“会话 cookie 超出允许的 4096 字节。”在使用 Next.js 14 typescript 的 next-auth 中

问题描述 投票:0回答:1

之前我使用next.js版本13.x.x,然后升级到next.js版本14.x.x,当使用next.js 13时,使用next-auth进行身份验证运行顺利,但是升级到next.js 14后,出现这样的错误终端控制台 message: 'Session cookie exceeds allowed 4096 bytes.'

这是我在 authoptions 中的完整代码

import { AuthOptions } from "next-auth";
import { PrismaAdapter } from "@next-auth/prisma-adapter";
import prisma from "./prisma";
import CredentialsProvider from "next-auth/providers/credentials";
import bcrypt from "bcrypt";

export const authOptions: AuthOptions = {
    adapter: PrismaAdapter(prisma),
    providers: [
        CredentialsProvider({
            credentials: {
                email: { label: 'email', type: 'text' },
                password: { label: 'password', type: 'password' },
            },

            authorize: async (credential) => {
                if (!credential?.email || !credential?.password) {
                    throw new Error("Invalid email or password");
                }

                const user = await prisma.user.findUnique({
                    where: { email: credential.email },
                    include: {
                        histories: true,
                        resto: true,
                    }
                });

                if (!user || !user?.password) {
                    throw new Error("Email does not match any user...");
                }

                const isCorrect = await bcrypt.compare(credential.password, user.password)
                if (!isCorrect) {
                    throw new Error("Password salah euy")
                }

                return {
                    ...user,
                    id: user.id.toString(),
                    name: user.name,
                    role: user.role,
                };
            },
        })
    ],
    callbacks: {
        jwt: async ({ token, user, session, trigger }) => {
            if (trigger === 'update') {
                return {
                    ...token,
                    ...session.user
                }
            }

            if (user) {
                const userRelation = await prisma.user.findUnique({
                    where: { id: Number(user.id) },
                    include: {
                        histories: true,
                        resto: true,
                    }
                });

                if (!userRelation) {
                    throw new Error("User not found");
                }

                return {
                    ...token,
                    // id: user.id,
                    ...userRelation
                };
            }

            if (token.name !== null && token.name !== undefined) {
                await prisma.user.update({
                    where: { id: Number(token.id) },
                    data: { name: token.name }
                });
            }

            return token;
        },
        session: async ({ session, token, user }) => {
            const newSession = {
                ...session,
                user: {
                    ...session.user,
                    id: token.id,
                    name: token.name,
                    role: token.role,
                }
            }

            return newSession;
        },
    },
    pages: {
        signIn: '/',
        error: '/',
    },
    debug: true,
    session: { strategy: "jwt" },
    secret: "rahasia",
}

然后调用文件route.ts中的authoptions

// route.ts
import { authOptions } from '@/lib/auth';
import NextAuth from 'next-auth';

const handler = NextAuth(authOptions);
export { handler as GET, handler as POST }

这是我的文件 next-auth.d.ts

// next-auth.d.ts
import NextAuth from "next-auth";

declare module "next-auth" {
  interface Session {
    user: {
      id: string;
      name: string;
      email: string;
      role: string;
      [key: string]: string;
    };
  }
}

我该如何解决这个问题?或者我应该降级到 next.js 版本 13.x.x。再次

next.js session-cookies next-auth
1个回答
0
投票

我将 jwt 回调的主体更改为更加简洁,并且它起作用了

jwt: async ({ token, user, session, trigger }) => {
        if (trigger === 'update') {
            return {
                ...token,
                ...session.user
            }
        }

        if (user) {
            if (!user) return token

            return {
                ...token,
                id: user.id,
                role: user.role,
            }
        }

        if (token.name !== null && token.name !== undefined) {
            await prisma.user.update({
                where: { id: Number(token.id) },
                data: { name: token.name }
            });
        }

        return token;
    },
© www.soinside.com 2019 - 2024. All rights reserved.