Esempio semi-ufficiale
Gli with-cookie-auth
esempi reindirizzano in getInitialProps
. Non sono sicuro che si tratti di un modello valido o meno, ma ecco il codice:
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()
}
}
Gestisce sia lato server che lato client. La fetch
chiamata è quella che ottiene effettivamente il token di autenticazione, è possibile che si desideri incapsularla in una funzione separata.
Quello che consiglierei invece
1. Reindirizzamento sul rendering lato server (evitare il flash durante SSR)
Questo è il caso più comune. Si desidera reindirizzare a questo punto per evitare che la pagina iniziale lampeggi al primo caricamento.
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. Reindirizzamento in componentDidMount (utile quando SSR è disabilitato, ad es. In modalità statica)
Questo è un fallback per il rendering lato client.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Non ho potuto evitare di eseguire il flashing della pagina iniziale in modalità statica aggiungendo questo punto, perché non è possibile reindirizzare durante la generazione statica, ma sembra meglio dei soliti approcci. Proverò a modificare mentre faccio progressi.
L'esempio completo è qui
Problema rilevante, che purtroppo finisce con una sola risposta del cliente