使用通配符/自定义域的NextAuth

osh3o9ms  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(175)

bounty将在6天内到期。回答此问题可获得+300声望奖励。asanas正在寻找一个规范答案

我有一个NextJS应用程序。这是一个多租户SaaS应用程序。
该应用程序为每个客户提供了使用我们网站上的子域或将其自定义域Map维斯CNAME的选项。
我想让我们的客户允许他们的员工登录他们的子域网站或自定义域。

export const authOptions: NextAuthOptions = {
  // Configure one or more authentication providers
  providers: [
     EMAIL PROVIDER
    // ...add more providers here
  ],
  pages: {
    signIn: `/login`,
    verifyRequest: `/verify`,
  },
  adapter: PrismaAdapter(prisma),
  callbacks: {

  },
  cookies: {
    sessionToken: {
      name: 'next-auth.session-token',
      options: {
        httpOnly: true,
        sameSite: 'lax',
        path: '/',
        domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
      }
    },
    callbackUrl: {
      name: 'next-auth.callback-url',
      options: {
        sameSite: 'lax',
        path: '/',
        domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
      }
    },
    csrfToken: {
      name: 'next-auth.csrf-token',
      options: {
        sameSite: 'lax',
        path: '/',
        domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
      }
    }
  }  
}

export default NextAuth(authOptions)

有了上面的[...nextauth]文件,我就可以让它与子域一起工作了,因为我正在使用'. mysaas.com'作为域cookie。
但是,它不适用于Map到子域的自定义域?我该如何做到这一点?
如果我可以动态设置cookie域,以便我可以动态地将域设置为实际域,那么它就可以工作了。就像不是.mysaas.com一样,如果我可以将其设置为.mycustomdomain.com,如果登录页面是从这个自定义域调用的,那么问题就得到了解决。
但是,我无法找到动态设置此cookie域的方法。任何帮助都很感激。

i86rm4rw

i86rm4rw1#

根据您的要求,您必须允许从子域和自定义域在您的配置中登录。这可以通过修改cookie部分轻松完成。

export const authOptions: NextAuthOptions = {
  // Configure one or more authentication providers
  providers: [
    // EMAIL PROVIDER
    // ...add more providers here
  ],
  pages: {
    signIn: `/login`,
    verifyRequest: `/verify`,
  },
  adapter: PrismaAdapter(prisma),
  callbacks: {
    session: async (session, user) => {
      // Set the session's domain based on the incoming request
      session.domain = session?.cookies?.nextauth_url
        ? new URL(session.cookies.nextauth_url).hostname
        : undefined;

      return Promise.resolve(session);
    },
  },
  cookies: {
    sessionToken: {
      name: 'next-auth.session-token',
      options: {
        httpOnly: true,
        sameSite: 'lax',
        path: '/',
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
      },
    },
    callbackUrl: {
      name: 'next-auth.callback-url',
      options: {
        sameSite: 'lax',
        path: '/',
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
      },
    },
    csrfToken: {
      name: 'next-auth.csrf-token',
      options: {
        sameSite: 'lax',
        path: '/',
        secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
      },
    },
  },
};

export default NextAuth(authOptions);

如果你需要帮助,请告诉我。

相关问题