Ejemplo semioficial
Los with-cookie-auth
ejemplos redirigen en getInitialProps
. No estoy seguro de si es un patrón válido o no, pero aquí está el código:
Profile.getInitialProps = async ctx => {
const { token } = nextCookie(ctx)
const apiUrl = getHost(ctx.req) + '/api/profile'
const redirectOnError = () =>
typeof window !== 'undefined'
? Router.push('/login')
: ctx.res.writeHead(302, { Location: '/login' }).end()
try {
const response = await fetch(apiUrl, {
credentials: 'include',
headers: {
Authorization: JSON.stringify({ token }),
},
})
if (response.ok) {
const js = await response.json()
console.log('js', js)
return js
} else {
// https://github.com/developit/unfetch#caveats
return await redirectOnError()
}
} catch (error) {
// Implementation or Network error
return redirectOnError()
}
}
Maneja tanto el lado del servidor como el lado del cliente. La fetch
llamada es la que realmente obtiene el token de autenticación, es posible que desee encapsular esto en una función separada.
Lo que recomendaría en su lugar
1. Redireccionar en el render del lado del servidor (evitar flash durante SSR)
Este es el caso más común. Desea redirigir en este punto para evitar que la página inicial parpadee en la primera carga.
MyApp.getInitialProps = async appContext => {
const currentUser = await getCurrentUser(); // define this beforehand
const appProps = await App.getInitialProps(appContext);
// check that we are in SSR mode (NOT static and NOT client-side)
if (typeof window === "undefined" && appContext.ctx.res.writeHead) {
if (!currentUser && !isPublicRoute(appContext.router.pathname)) {
appContext.ctx.res.writeHead(302, { Location: "/account/login" });
appContext.ctx.res.end();
}
}
return { ...appProps, currentUser };
};
2. Redireccionar en componentDidMount (útil cuando SSR está desactivado, por ejemplo, en modo estático)
Esta es una alternativa para la representación del lado del cliente.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
No pude evitar mostrar la página inicial en modo estático, agregue este punto, porque no puede redirigir durante la compilación estática, pero parece mejor que los enfoques habituales. Intentaré editar a medida que avance.
El ejemplo completo está aquí.
Problema relevante, que lamentablemente termina con una respuesta solo del cliente