Next Auth中间件token始终返回null,登录后仍被重定向至登录页
登录后页面一直被重定向回登录页,排查发现NextAuth Middleware里的request.nextauth.token始终返回null,但浏览器Cookies中已经生成了有效的token。参考官方文档尝试简化Middleware代码(直接导出next-auth/middleware),问题依然存在。
相关代码
Middleware 代码
import { withAuth, NextRequestWithAuth } from 'next-auth/middleware' import { NextResponse } from 'next/server' export default withAuth( // `withAuth` augments your `Request` with the user's token. function middleware(request: NextRequestWithAuth) { console.log('pathname: ', request.nextUrl.pathname) console.log('request.nextauth.token', request.nextauth.token) if (!request.nextauth.token) { return NextResponse.redirect('http://localhost:3000/login') } }, { callbacks: { authorized: ({ token, req }) => { console.log('token:', !!token, token) return !!token }, }, }, ) export const config = { matcher: ['/admin', '/'] }
NextAuth 配置代码
import { NextAuthOptions } from 'next-auth' import GithubProvider from 'next-auth/providers/github' import EmailProvider from 'next-auth/providers/email' import CredentialsProvider from 'next-auth/providers/credentials' import { PrismaAdapter } from '@auth/prisma-adapter' import { compare } from 'bcrypt' import prisma from './db' export const authOptions = { secret: process.env.NEXT_AUTH_SECRET, adapter: PrismaAdapter(prisma), providers: [ CredentialsProvider({ name: 'Credentials', credentials: { email: { label: 'Email', type: 'email' }, password: { label: 'Password', type: 'password' }, }, async authorize(credentials) { if (!credentials?.email || !credentials.password) { throw new Error('Please enter an email and password') } const user = await prisma.user.findUnique({ where: { email: credentials.email, }, }) if (!user || !user?.password) { throw new Error('No user found') } const isValid = await compare(credentials.password, user.password) if (!isValid) { throw new Error('Invalid password') } if (user) { return user } return null }, }), GithubProvider({ clientId: process.env.GITHUB_CLIENT_ID as string, clientSecret: process.env.GITHUB_CLIENT_SECRET as string, }), EmailProvider({ server: { host: process.env.EMAIL_SERVER_HOST, port: process.env.EMAIL_SERVER_PORT, auth: { user: process.env.EMAIL_SERVER_USER, pass: process.env.EMAIL_SERVER_PASSWORD, }, }, from: process.env.EMAIL_FROM, }), ], callbacks: { async jwt({ token, user, account }) { if (user) { return { ...token, id: account?.id ? account.id : user.id, accessToken: account?.access_token, role: user.role, } } return token }, async session({ session, token }) { return { ...session, user: { ...session.user, id: token.id, name: token.name, accessToken: token.accessToken ? token.accessToken : null, role: token.role, }, } }, }, session: { strategy: 'jwt', }, // debug: process.env.NODE_ENV === 'development', } satisfies NextAuthOptions
尝试的简化Middleware代码
export { default } from "next-auth/middleware"; export const config = { matcher: ['/admin', '/'] };
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

