下一个身份验证会话未在 netlify 中清除

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

我使用 next-auth(5.0.0-beta.18) 在我的应用程序中使用凭据提供程序进行身份验证并在 netlify 上部署应用程序。问题是我面临的问题是当我注销并刷新时它不会清除会话。尽管它在本地和 vercel 上都工作得很好。

下一步身份验证配置auth.ts:

export const { handlers, signIn, signOut, auth } = NextAuth({
    providers: [
        Credentials({
            id: "credentials",
            name: "credentials",
            credentials: {
                email: {
                    label: "Email"
                },
                password: {
                    label: "Password",
                    type: "password"
                }
            },
            async authorize(credentials) {
                const { response, error } = await withAsync(() => signInWithCredentials({
                    email: credentials.email as string,
                    password: credentials.password as string
                }));

                if (error) {
                    if (isApiError(error)) {
                        return null;
                    } else {
                        throw new Error("An unexpected issue occurred.");
                    }
                }

                return {
                    ...response
                };
            },
        }),
        Credentials({
            id: "register",
            name: "register",
            async authorize(credentials) {
                console.log("credentials: ", credentials);
                
                const response = JSON.parse(JSON.stringify(credentials));
                const user = removePrefixFromObjectKeys(response, "userpre_")
                const metadata = removePrefixFromObjectKeys(response, "metadatapre_")
                user.metadata = metadata;

                return {
                    ...response,
                    user
                }
            },
        })
    ],
    callbacks: {
        jwt({ token, user }) {
            if (user) return { ...token, ...user }

            return token;
        },
        session(params) {
            const { session, token } = params;
            // @ts-ignore
            session.user = token;

            return session;
        },
    },
    pages: {
        signIn: "/signin",
        newUser: "/",
    },
    secret: process.env.AUTH_SECRET,
    trustHost: true,
})

我通过单击按钮在导航栏中调用 authSignOut 服务器操作

export function NavAction() {
    return (
        <div className="flex items-center gap-4">
            <Button variant="fatal">
                <HiOutlineGift className="h-4 w-4 mr-2" />
                Your entries: 53
            </Button>

            <DropdownMenu>
                <DropdownMenuTrigger asChild>
                    <button>
                        <HiUserCircle className="h-12 w-12" />
                    </button>
                </DropdownMenuTrigger>
                <DropdownMenuContent className="w-20 z-[9999]">
                    <DropdownMenuItem onClick={async () => {
                        await authSignOut()
                    }}>
                        <HiMiniArrowRightOnRectangle className="mr-2 h-4 w-4" />
                        <span>Log out</span>
                    </DropdownMenuItem>
                </DropdownMenuContent>
            </DropdownMenu>
        </div>
    )

}

auth action.ts 的服务器操作:

"use server";

import { signOut, signIn } from "@/auth";
import { AuthError } from "next-auth";

function isRedirectError(error: Error & { digest?: string }) {
    return !!error.digest?.startsWith("NEXT_REDIRECT")
}

export async function authSignOut() {
    // await signOut({
    //     redirect: false
    // });
    await signOut();
}

export async function authSignIn(prevState: any, data: FormData) {
    try {
        await signIn('credentials', data);

        return {
            status: 'success',
            error: ''
        }
    } catch (error) {
        if (isRedirectError(error as Error)) {
            return {
                status: 'success',
                error: ''
            }
        };

        if (error instanceof AuthError) {
            switch (error.type) {
                case 'CredentialsSignin':
                    return {
                        status: 'failed',
                        error: 'Invalid email or password.'
                    };
                default:
                    return {
                        status: 'failed',
                        error: 'Something went wrong.'
                    };
            }
        }

        throw error;
    }
}

export async function authRegisterSigIn(data: FormData) {
    await signIn("register", data);
}
next.js netlify next-auth
1个回答
0
投票

我也经历着同样的事情。我必须将代码移至 vercel 进行测试,它在 vercel 上运行完美

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.