Полуофициальный пример
Эти 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. Перенаправление в componentDidMount (полезно, когда SSR отключен, например, в статическом режиме)
Это запасной вариант для рендеринга на стороне клиента.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Я не мог избежать перепрошивки начальной страницы в статическом режиме, добавив этот пункт, потому что вы не можете перенаправить во время статической сборки, но это кажется лучше, чем обычные подходы. Я постараюсь редактировать, как я делаю успехи.
Полный пример здесь
Актуальная проблема, которая, к сожалению, заканчивается только ответом клиента