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

Next-Auth中如何将依赖函数参数的providers置于主作用域?

解决Next-Auth中导出authOptions并获取req的问题

核心思路

把原本定义在auth函数内的providers改成接收req参数的工厂函数,既可以把核心逻辑移到全局作用域,又能让authorize方法拿到所需的req对象。之后在auth函数内部调用这个工厂函数生成providers,再构建authOptions并导出,满足unstable_getserversession的使用要求。

具体实现步骤

1. 封装Providers为工厂函数

将CredentialsProvider的创建逻辑抽成全局函数,传入req作为参数:

import CredentialsProvider from "next-auth/providers/credentials";
import { getCsrfToken } from "next-auth/react";
import SiweMessage from "siwe";

// 全局作用域的providers工厂函数
const createProviders = (req: any) => [
  CredentialsProvider({
    name: "Ethereum",
    credentials: {
      message: {
        label: "Message",
        type: "text",
        placeholder: "0x0",
      },
      signature: {
        label: "Signature",
        type: "text",
        placeholder: "0x0",
      },
    },
    async authorize(credentials) {
      try {
        const siwe = new SiweMessage(JSON.parse(credentials?.message || "{}"));
        const nextAuthUrl = new URL(process.env.NEXTAUTH_URL!);

        const result = await siwe.verify({
          signature: credentials?.signature || "",
          domain: nextAuthUrl.host,
          nonce: await getCsrfToken({ req }), // 正常获取传入的req
        });

        // 补全用户信息返回逻辑
        if (result.success) {
          return { id: siwe.address };
        }
        return null;
      } catch (error) {
        console.error(error);
        return null;
      }
    },
  }),
];

2. 重构auth函数并导出authOptions

在auth函数内部调用工厂函数生成providers,构建authOptions并导出:

import NextAuth from "next-auth";
import type { AuthOptions } from "next-auth";

// 导出authOptions供unstable_getserversession使用
export let authOptions: AuthOptions;

export default async function auth(req: any, res: any) {
  // 传入当前req生成providers
  const providers = createProviders(req);

  // 构建完整的auth配置
  authOptions = {
    providers,
    secret: process.env.NEXTAUTH_SECRET,
    session: { strategy: "jwt" },
    // 补全你的其他配置(如callbacks等)
  };

  // 调用NextAuth处理请求
  return NextAuth(req, res, authOptions);
}

3. 在其他位置使用unstable_getserversession

现在可以直接导入authOptions使用:

import { unstable_getServerSession } from "next-auth/next";
import { authOptions } from "./api/auth/[...nextauth]";

export async function getServerSideProps(context: any) {
  const session = await unstable_getServerSession(context.req, context.res, authOptions);
  // 后续业务逻辑
  return { props: { session } };
}

注意事项

  • 确保process.env.NEXTAUTH_URL和process.env.NEXTAUTH_SECRET已在环境变量中正确配置
  • 若使用TypeScript,建议替换any类型为更精确的类型定义
  • authOptions会在auth函数执行时赋值,Next.js的运行流程中API路由优先处理,无需担心初始化顺序问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:00:51