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
相关产品推荐
相关产品推荐

