NextAuth 与通配符/自定义域名

huangapple go评论107阅读模式
英文:

NextAuth with Wildcard / Custom Domains

问题

我有一个NextJS应用程序。它是一个多租户SaaS应用程序。

该应用程序为每个客户提供了在我们的网站上使用子域或通过CNAME映射其自定义域的选项。

我想允许我们的客户允许他们的员工在其子域站点或自定义域上登录。

  1. export const authOptions: NextAuthOptions = {
  2. // 配置一个或多个身份验证提供程序
  3. providers: [
  4. 电子邮件提供程序
  5. // ...在这里添加更多提供程序
  6. ],
  7. pages: {
  8. signIn: `/login`,
  9. verifyRequest: `/verify`,
  10. },
  11. adapter: PrismaAdapter(prisma),
  12. cookies: {
  13. sessionToken: {
  14. name: 'next-auth.session-token',
  15. options: {
  16. httpOnly: true,
  17. sameSite: 'lax',
  18. path: '/',
  19. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  20. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  21. }
  22. },
  23. callbackUrl: {
  24. name: 'next-auth.callback-url',
  25. options: {
  26. sameSite: 'lax',
  27. path: '/',
  28. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  29. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  30. }
  31. },
  32. csrfToken: {
  33. name: 'next-auth.csrf-token',
  34. options: {
  35. sameSite: 'lax',
  36. path: '/',
  37. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  38. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  39. }
  40. }
  41. }
  42. }
  43. export default NextAuth(authOptions)

通过上面的 [...nextauth] 文件,我能够使其在子域上运行,因为我在域cookie中使用了 '.mysaas.com'。

但是,将自定义域映射到子域时不起作用?我该如何实现这一点?

如果我可以动态设置cookie域,以便可以将域动态设置为实际域,那么它将起作用。就像不是.mysaas.com,而是.mycustomdomain.com,如果从这个自定义域调用登录页面,那么问题就解决了。

然而,我找不到一种动态设置此cookie域的方法。任何帮助将不胜感激。

英文:

I have a NextJS application. It's a multi-tenant SaaS application.

The app provides each customer with the option to use a subdomain on our site or to map their custom domain vis CNAME.

I want to allow our customers to allow their employees to login on their subdomain site or custom domain.

  1. export const authOptions: NextAuthOptions = {
  2. // Configure one or more authentication providers
  3. providers: [
  4. EMAIL PROVIDER
  5. // ...add more providers here
  6. ],
  7. pages: {
  8. signIn: `/login`,
  9. verifyRequest: `/verify`,
  10. },
  11. adapter: PrismaAdapter(prisma),
  12. callbacks: {
  13. },
  14. cookies: {
  15. sessionToken: {
  16. name: 'next-auth.session-token',
  17. options: {
  18. httpOnly: true,
  19. sameSite: 'lax',
  20. path: '/',
  21. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  22. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  23. }
  24. },
  25. callbackUrl: {
  26. name: 'next-auth.callback-url',
  27. options: {
  28. sameSite: 'lax',
  29. path: '/',
  30. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  31. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  32. }
  33. },
  34. csrfToken: {
  35. name: 'next-auth.csrf-token',
  36. options: {
  37. sameSite: 'lax',
  38. path: '/',
  39. domain: process.env.NODE_ENV === 'production' ? '.mysaas.com' : undefined,
  40. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false
  41. }
  42. }
  43. }
  44. }
  45. export default NextAuth(authOptions)

With the above [...nextauth] file, I'm able to make it work with subdomains as I'm using '.mysaas.com' for domain cookie.

However, it doesn't work with a custom domain mapped to a subdomain? How can I achieve that?

If I can set the cookie domain dynamically so that I can dynamically set the domain to the actual domain, then it will work. Like instead of .mysaas.com, if I could set it to .mycustomdomain.com, if the login page is called from this custom domain, then the problem gets resolved.

However, I cannot find a way to set this cookie domain dynamically. Any help is appreciated.

答案1

得分: 1

由于NextAuth默认使用当前域名,因此完全删除NextAuth配置中的domain属性应该就可以解决问题。

英文:

Since NextAuth is using current domain by default, completely removing the domain prop from your NextAuth config should do the trick.

答案2

得分: 0

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

  1. export const authOptions: NextAuthOptions = {
  2. // 配置一个或多个身份验证提供者
  3. providers: [
  4. // 电子邮件提供者
  5. // ...在这里添加更多提供者
  6. ],
  7. pages: {
  8. signIn: `/login`,
  9. verifyRequest: `/verify`,
  10. },
  11. adapter: PrismaAdapter(prisma),
  12. callbacks: {
  13. session: async (session, user) => {
  14. // 根据传入的请求设置会话的域
  15. session.domain = session?.cookies?.nextauth_url
  16. ? new URL(session.cookies.nextauth_url).hostname
  17. : undefined;
  18. return Promise.resolve(session);
  19. },
  20. },
  21. cookies: {
  22. sessionToken: {
  23. name: 'next-auth.session-token',
  24. options: {
  25. httpOnly: true,
  26. sameSite: 'lax',
  27. path: '/',
  28. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  29. },
  30. },
  31. callbackUrl: {
  32. name: 'next-auth.callback-url',
  33. options: {
  34. sameSite: 'lax',
  35. path: '/',
  36. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  37. },
  38. },
  39. csrfToken: {
  40. name: 'next-auth.csrf-token',
  41. options: {
  42. sameSite: 'lax',
  43. path: '/',
  44. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  45. },
  46. },
  47. },
  48. };
  49. export default NextAuth(authOptions);

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

英文:

As per your requirement you have to allow login from both subdomain and your custom domain in your configuration. This can be easily done by modifying cookie section.

  1. export const authOptions: NextAuthOptions = {
  2. // Configure one or more authentication providers
  3. providers: [
  4. // EMAIL PROVIDER
  5. // ...add more providers here
  6. ],
  7. pages: {
  8. signIn: `/login`,
  9. verifyRequest: `/verify`,
  10. },
  11. adapter: PrismaAdapter(prisma),
  12. callbacks: {
  13. session: async (session, user) => {
  14. // Set the session's domain based on the incoming request
  15. session.domain = session?.cookies?.nextauth_url
  16. ? new URL(session.cookies.nextauth_url).hostname
  17. : undefined;
  18. return Promise.resolve(session);
  19. },
  20. },
  21. cookies: {
  22. sessionToken: {
  23. name: 'next-auth.session-token',
  24. options: {
  25. httpOnly: true,
  26. sameSite: 'lax',
  27. path: '/',
  28. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  29. },
  30. },
  31. callbackUrl: {
  32. name: 'next-auth.callback-url',
  33. options: {
  34. sameSite: 'lax',
  35. path: '/',
  36. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  37. },
  38. },
  39. csrfToken: {
  40. name: 'next-auth.csrf-token',
  41. options: {
  42. sameSite: 'lax',
  43. path: '/',
  44. secure: process.env.NODE_ENV && process.env.NODE_ENV === 'production' ? true : false,
  45. },
  46. },
  47. },
  48. };
  49. export default NextAuth(authOptions);

If you need help please let me know.

huangapple
  • 本文由 发表于 2023年6月18日 20:57:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/76500654.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定