如何在next-auth(使用keycloack)中为SSO(单点登录)配置cookie?¿

nbewdwxp  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(172)

我有一个简单的设置,我使用next-auth沿着和keycloack provider,以便有一个身份验证/授权系统。
我面临的问题是,我需要SSO,我一直试图做一些改变(特别是在饼干方面),但还没有能够得到我想要的。
假设我们有两个子域stuff.example.com-damn.example.com,我想使用next-auth登录一次keycloack,并且能够使用同一个用户使用这两个Web应用程序,而不必每次登录另一个子域。
到目前为止,这个简单的设置可以按预期工作

export default NextAuth({
  debug: true,

  providers: [
    KeycloackProvider({
      clientId: "next-sso-client-1",
      clientSecret: "SSO-example",
      issuer: "http://localhost:8080/realms/SSO-example",
    }),
  ],

  callbacks: {
    async jwt({ token, profile, account }) {
      if (profile) {
        token.profile = profile;
        token.idToken = account?.id_token;
      }
      return Promise.resolve(token);
    },

    async session({ session, token }) {
      // @ts-ignore
      session.user.profile = token.profile;
      return session;
    },
  },
})

如果我登录,默认的cookie设置,我可以得到用户信息.

但是,如果我尝试获取主域并将其设置为我的自定义cookie,以便每个子域都可以识别这些cookie并获取用户数据,而不必每次登录到另一个网站时,一切都会中断。

const obtenerDominio = (url: string) => {
  const dominio = new URL(url).hostname.split(".");
  return dominio
    .slice(0)
    .slice(-(dominio.length === 4 ? 3 : 2))
    .join(".");
};

const useSecureCookies = process.env.NEXTAUTH_URL?.startsWith("http://");
const cookiePrefix = useSecureCookies ? "__Secure-" : "";
const hostName = obtenerDominio(process.env.NEXTAUTH_URL!);

export default NextAuth({
  debug: true,

  providers: [
    KeycloackProvider({
      clientId: "next-sso-client-1",
      clientSecret: "SSO-example",
      issuer: "http://localhost:8080/realms/SSO-example",
    }),
  ],

  callbacks: {
    async jwt({ token, profile, account }) {
      if (profile) {
        token.profile = profile;
        token.idToken = account?.id_token;
      }
      return Promise.resolve(token);
    },

    async session({ session, token }) {
      // @ts-ignore
      session.user.profile = token.profile;
      return session;
    },
  },

  cookies: {
    sessionToken: {
      name: `${cookiePrefix}next-auth.session-token`,
      options: {
        httpOnly: true,
        sameSite: "lax",
        path: "/",
        secure: useSecureCookies,
        domain: hostName == "localhost" ? hostName : "." + hostName, // add a . in front so that subdomains are included
      },
    },

    callbackUrl: {
      name: `${cookiePrefix}next-auth.callback-url`,
      options: {
        httpOnly: true,
        sameSite: "lax",
        path: "/",
        secure: useSecureCookies,
        domain: hostName == "localhost" ? hostName : "." + hostName, // add a . in front so that subdomains are included
      },
    },

    csrfToken: {
      name: `${cookiePrefix}next-auth.csrf-token`,
      options: {
        httpOnly: true,
        sameSite: "lax",
        path: "/",
        secure: false,
        domain: hostName == "localhost" ? hostName : "." + hostName, // add a . in front so that subdomains are included
      },
    },
  },
});

没有设置cookie,甚至无法进入登录表单。

如果我注解了自定义的csrsToken,它允许我登录,并设置了默认cookie,但无法获取用户数据,并且其他cookie,如next-auth.session-token没有设置。

我该怎么做,我怎么才能让它工作?¿

kwvwclae

kwvwclae1#

我犯了一个特别的错误
这行代码是错误的
const useSecureCookies = process.env.NEXTAUTH_URL?.startsWith("http://");
你必须把它改为https,所以useSecureCookies的值将是false,secure的cookie选项也将是false,这就是它应该是的,因为在本地开发中,我们通常不使用https,只在prod中使用。
有了这个变化,我们将能够设置自定义域的自定义cookie,并具有SSO。

相关问题