我有一个简单的设置,我使用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没有设置。
我该怎么做,我怎么才能让它工作?¿
1条答案
按热度按时间kwvwclae1#
我犯了一个特别的错误
这行代码是错误的
const useSecureCookies = process.env.NEXTAUTH_URL?.startsWith("http://");
你必须把它改为
https
,所以useSecureCookies
的值将是false,secure
的cookie选项也将是false,这就是它应该是的,因为在本地开发中,我们通常不使用https,只在prod中使用。有了这个变化,我们将能够设置自定义域的自定义cookie,并具有SSO。