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

如何配置Next-Auth回调URL?部署后Session返回空值问题

问题概述

已配置登录、登出的回调URL如下:

//signIn
 const signInResult = await signIn("credentials", {
    message,
    signature,
    redirect: false,
    callbackUrl: `${env.nextauth_url}`,
});

//signOut
signOut({ callbackUrl: `${env.nextauth_url}`, redirect: false });

但部署后出现以下异常:

  • 登录时网络请求api/auth/providers与api/auth/callback/credentials?返回的callbackUrl仍为localhost:3000
  • api/auth/session返回空对象
  • 本地http://localhost:3000运行正常,仅部署后登录功能失效

附上[...next-auth]代码:

import CredentialsProvider from "next-auth/providers/credentials";
import NextAuth from "next-auth";
import Moralis from "moralis";
import env from "env.json";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "MoralisAuth",
      credentials: {
        message: {
          label: "Message",
          type: "text",
          placeholder: "0x0",
        },
        signature: {
          label: "Signature",
          type: "text",
          placeholder: "0x0",
        },
      },
      async authorize(credentials: any): Promise<any> {
        try {
          const { message, signature } = credentials;
          await Moralis.start({
            apiKey: env.moralis_api_key,
          });
          const { address, profileId } = (
            await Moralis.Auth.verify({ message, signature, network: "evm" })
          ).raw;
          if (address && profileId) {
            const user = { address, profileId, signature };
            if (user) {
              return user;
            }
          }
        } catch (error) {
          console.error(error);
          return null;
        }
      },
    }),
  ],
  pages: {
    signIn: "/",
    signOut: "/",
  },
  session: {
    maxAge: 3 * 24 * 60 * 60,
  },
  callbacks: {
    async jwt({ token, user }) {
      user && (token.user = user);
      return token;
    },
    async session({ session, token }: any) {
      session.user = token.user;
      return session;
    },
    async redirect({ url, baseUrl }) {
      // Allows relative callback URLs
      if (url.startsWith("/")) return `${baseUrl}${url}`;
      // Allows callback URLs on the same origin
      else if (new URL(url).origin === baseUrl) return url;
      return baseUrl;
    },
  },
  secret: env.nextauth_secret,
});

解决方案

1. 修正环境变量加载逻辑

Next.js生产环境不会自动读取env.json文件,需改用平台环境变量配置(如Vercel/Netlify的环境变量面板)或.env.production文件存储nextauth_url、moralis_api_key、nextauth_secret,并确保nextauth_url设置为部署后的完整域名(如https://your-deployed-domain.com)。

2. 显式指定NextAuth的baseUrl

在NextAuth配置中添加baseUrl,避免自动推导错误:

export default NextAuth({
  // ...其他配置
  baseUrl: process.env.NEXTAUTH_URL, // 使用生产环境变量
  // ...
})

3. 调整redirect回调逻辑

当前回调可能限制了合法callbackUrl的跳转,修改为优先使用传入的有效URL:

async redirect({ url, baseUrl }) {
  // 允许相对路径或同域名的回调URL
  if (url.startsWith("/") || new URL(url).origin === baseUrl) {
    return url;
  }
  // 非法URL fallback到baseUrl
  return baseUrl;
}

4. 优化session与token回调

确保用户信息正确传递,避免对象引用问题:

async jwt({ token, user }) {
  if (user) {
    // 直接赋值具体字段,而非整对象
    token.address = user.address;
    token.profileId = user.profileId;
  }
  return token;
},
async session({ session, token }) {
  if (token) {
    session.user = {
      address: token.address,
      profileId: token.profileId
    };
  }
  return session;
}

5. 全局初始化Moralis

避免在authorize回调中重复初始化,改为文件顶部全局初始化:

import Moralis from "moralis";

// 全局初始化Moralis
Moralis.start({
  apiKey: process.env.MORALIS_API_KEY,
});

export default NextAuth({
  // ...其他配置
})

关键排查点
  • 查看部署服务器日志,确认环境变量是否正确加载,是否存在Moralis验证或NextAuth的报错信息
  • 检查浏览器控制台,排查Cookies存储问题(如SameSite属性不匹配、域名不一致导致session无法写入)

内容的提问来源于stack exchange,提问作者judy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:40:27