Contoh semi resmi
The with-cookie-auth
contoh redirect di getInitialProps
. Saya tidak yakin apakah ini pola yang valid atau belum, tapi ini kodenya:
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()
}
}
Ini menangani sisi server dan sisi klien. Itufetch
panggilan adalah salah satu yang benar-benar mendapatkan token auth, Anda mungkin ingin merangkum ini menjadi fungsi yang terpisah.
Apa yang saya sarankan sebagai gantinya
1. Redirect pada render sisi server (hindari flash selama SSR)
Ini adalah kasus yang paling umum. Anda ingin mengarahkan pada titik ini untuk menghindari halaman awal berkedip saat memuat pertama.
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. Redirect di componentDidMount (berguna ketika SSR dinonaktifkan, misalnya dalam mode statis)
Ini adalah fallback untuk rendering sisi klien.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
Saya tidak bisa menghindari mem-flash halaman awal dalam mode statis menambahkan titik ini, karena Anda tidak dapat mengarahkan ulang selama pembuatan statis, tetapi tampaknya lebih baik daripada pendekatan yang biasa. Saya akan mencoba mengedit saat saya membuat kemajuan.
Contoh lengkap ada di sini
Masalah yang relevan, yang sayangnya berakhir dengan jawaban klien saja