我想包装我的整个应用程序,以便除非用户登录,否则无法访问它。如果用户未登录,我设法将用户重定向到登录页面,但是,我之前仍然看到私有路由的闪光发生重定向。如何避免这种情况?
问问题
1738 次
1 回答
4
由于 NextJS 是在服务器端呈现的,因此您需要getServerSideProps
在重定向之前检查身份验证或在前端显示加载指示器。
检查身份验证客户端
创建一个包装器组件并将其放入您的_app.js
文件中。通过在用户仍在进行身份验证时显示加载组件,您可以防止显示私人仪表板。注意:因为 Next.js 是服务器端渲染的,所以 HTML 总是会在 JS 重新水化之前显示出来。这意味着,第一次绘制总是在重定向开始之前发生。
import { useRouter } from 'next/router'
export const AuthCheck = (props) => {
const router = useRouter()
const user = useUser() // you need to implement this. In this example, undefined means things are still loading, null means user is not signed in, anything truthy means they're signed in
if (typeof window !== 'undefined' && user === null) router.push('/sign-in')
if(!user) return <Loading /> // a loading component that prevents the page from rendering
return props.children
}
然后在你的_app.js
const MyApp = ({ Component, pageProps }) => {
return (
<AuthCheck>
<Component {...pageProps} />
</AuthCheck>
)
}
export default MyApp
检查认证服务器端
假设您已经有代码设置来检查服务器端的身份验证,您可以使用此模式。注意:您需要将其添加到每个页面。getServerSideProps
不适用于 _app.js
或_document.js
export const getServerSideProps = async () => {
const isAuthenticated = await checkAuthentication() // you need to implement this
if (!isAuthenticated) {
return {
redirect: { destination: '/sign-in', permanent: false },
}
}
}
于 2021-03-21T03:30:19.267 回答