Напів офіційний приклад
Ці with-cookie-auth
приклади перенаправлення в getInitialProps
. Я не впевнений, чи це дійсний шаблон чи ні, але ось код:
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()
}
}
Він обробляє як серверну, так і клієнтську. fetch
Виклик є той , який на самому ділі отримати маркер аутентифікації, ви можете инкапсулировать це в окрему функцію.
Що я б замість цього порадив
1. Перенаправлення на рендеринг на стороні сервера (уникайте спалаху під час SSR)
Це найпоширеніший випадок. Ви хочете переадресувати в цей момент, щоб уникнути миготіння початкової сторінки при першому завантаженні.
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. Перенаправлення на компонентDidMount (корисно, коли SSR вимкнено, наприклад, у статичному режимі)
Це резервна копія для візуалізації на стороні клієнта.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Я не міг уникнути прошивання початкової сторінки в статичному режимі, додавши цей пункт, тому що ви не можете перенаправляти під час статичної збірки, але це здається краще, ніж звичайні підходи. Я спробую редагувати, коли я прогресую.
Повний приклад тут
Відповідне питання, яке, на жаль, закінчується лише відповіддю клієнта