You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next Auth中间件token始终返回null,登录后仍被重定向至登录页

登录后NextAuth Middleware中token始终为null,Cookies却存在有效token

登录后页面一直被重定向回登录页,排查发现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:15:15