Półoficjalny przykład
Do with-cookie-auth
przykładów przekierowanie w getInitialProps
. Nie jestem pewien, czy jest to prawidłowy wzorzec, czy nie, ale oto kod:
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()
}
}
Obsługuje zarówno po stronie serwera, jak i klienta. fetch
Połączenia jest taki, który rzeczywiście dostać token uwierzytelniający, możesz ująć to w osobnej funkcji.
Co radziłbym zamiast tego
1. Przekieruj na renderowaniu po stronie serwera (unikaj flashowania podczas SSR)
To najczęstszy przypadek. Chcesz przekierować w tym miejscu, aby uniknąć początkowego migania strony przy pierwszym ładowaniu.
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. Przekierowanie w componentDidMount (przydatne, gdy SSR jest wyłączony, np. W trybie statycznym)
Jest to awaria renderowania po stronie klienta.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Nie mogłem uniknąć flashowania strony początkowej w trybie statycznym, dodaj ten punkt, ponieważ nie możesz przekierować podczas kompilacji statycznej, ale wydaje się to lepsze niż zwykłe podejścia. Spróbuję edytować, gdy będę robić postępy.
Pełny przykład jest tutaj
Odpowiedni problem, który niestety kończy się odpowiedzią klienta