Si un usuario inicia sesión en la aplicación entre las actualizaciones de la aplicación, quiero cerrar la sesión del usuario la próxima vez que visite.
Extraigo la versión del package.json
y la almaceno en jwt/session para comparar la versión desde la que se autenticó el usuario y la versión que se está ejecutando ahora.
// pages/api/auth/[nextauth].ts const version = require('../../../package.json').version import NextAuth from 'next-auth' import { signOut } from 'next-auth/react' export default NextAuth({ providers: [ /*...*/ ], session: { strategy: 'jwt' }, callbacks: { async jwt(props) { const { token, user, account } = props const isSignIn = user?.username ? true :false if(isSignIn) { token.version = version // ... } if (token?.version !== version) { await signOut() return {} } return token }, // ... } })
Esto funciona, pero está arrojando un error.
https://next-auth.js.org/errors#jwt_session_error window is not defined { message: 'window is not defined', stack: ... name: 'ReferenceError }
Sé que se está generando el error porque estoy llamando a la función signOut
en el lado del servidor cuando se supone que es una función del lado del navegador, por lo tanto, el error para la window
no está definido.
¿De qué otra manera puedo llamar a la función signOut
sin que intente usar la llamada lateral del navegador, incluida la referencia a la window
?
No puede usar el cierre de sesión en el lado del servidor por lo que reuní, pero aquí hay un truco que usé en mi caso. En su lugar, intentar cerrar sesión desde el lado del servidor devuelve un código de error.
const version = require('../../../package.json').version import NextAuth from 'next-auth' import { signOut } from 'next-auth/react' export default NextAuth({ providers: [ /*...*/ ], session: { strategy: 'jwt' }, callbacks: { async jwt(props) { const { token, user, account } = props const isSignIn = user?.username ? true :false if(isSignIn) { token.version = version // ... } if (token?.version !== version) { return { // You can ignore this if you don't need the previous data ...token, // Return an error code error: "invalid-version", } } return token }, // ... } })
Cree un contenedor alrededor de las rutas seguras. también puede hacer esto en un diseño común.
export const Auth = ({children}) => { const { data: sessionData } = useSession(); const router = useRouter(); useEffect(() => { // check if the error has occurred if (sessionData?.user.error === "invalid-version") { // Sign out here signOut(); } }, [sessionData?.user.error, router]); return ( <>{children}</> ) }