我使用 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);
}
我也经历着同样的事情。我必须将代码移至 vercel 进行测试,它在 vercel 上运行完美