Is there any way we can Authenticate all the nested routes ?
In my project I have routes which needs authentication and routes which can be accessible without authentication.
For eg.
/admin => needs authentication
/admin/posts => needs authentication
/admin/posts/1 => needs authentication
/admin/users => needs authentication
and so on..
/view => can access without authentication
/view/songs => can access without authentication
/view/posts => can access without authentication
Things which I have tried :
HOC : need to include it in every route I create inside admin. Is there any way we can do it in common place ?
getServerSideProps : same as above
is there any way to do this in one common file ?
Advertisement
Answer
You can achieve this in multiple ways, just a couple of inputs :
If you are using next >= 13 with the new app directory routing convention you can use the layout.js
file in the root of /admin
folder :
export default function RootLayout({ children }) {
// your logic to check if the user is logged
if(/* user is logged */){
return (
<html>
<head></head>
<body>{children}</body>
</html>
)
}else{
return <p>Must be authenticated</p> // show login?
}
}
Otherwise you can use a similar logic inside the _App.js
import { useRouter } from 'next/router';
import {MyAuthComponent} from 'auth/path' // your login component
export default function MyApp({ Component, pageProps }) {
const router = useRouter();
const currentPath = router.asPath
const isPublicRoute = currentPath.includes('view') // your logic to check if the current route is public
if(isPublicRoute ){
return <Component {pageProps} />
}else{
return (
<MyAuthComponent>
<Component {pageProps} />
</MyAuthComponent>
)
}
}
And MyAuthComponent.js
export default function MyAuthComponent({ children }) {
// your logic to check if the user is logged
if(/* user is logged */){
return (
<html>
<head></head>
<body>{children}</body>
</html>
)
}else{
return <p>Must be authenticated</p> // show login?
}
}