У меня есть проект на Next.js и React, который не использует никаких библиотек для маршрутизации. Как мне реализовать защиту маршрута (защищенные маршруты) для неаутентифицированных пользователей? Или мне просто перенаправить их, если в cookie нет токена?





Вы можете проверить getInitialProps с некоторыми подходящими. логика оценки файлов cookie, чтобы решить, перенаправлять или нет.
import Router from 'next/router'
const redirectToLogin = res => {
if (res) {
res.writeHead(302, {Location: '/login'})
res.end()
res.finished = true
} else {
Router.push('/login')
}
}
class ProtectedPage extends React.Component {
static async getInitialProps ({req, res}) {
// get cookie from req.headers or from document.cookie in browser
// this cookie must not contain sensitive information!
const profile = getProfileFromCookie(req)
if (!profile) {
redirectToLogin(res)
}
}
}
Взгляните на этот пример кода https://github.com/lipp/login-with/blob/master/example/nextjs/with-profile.js#L8 (я автор).
как насчет всех вложенных маршрутов ниже protectedPage?
У меня было много проблем с этим, но в конце концов мне удалось во всем разобраться.
Я использую apollo, и моя проблема заключалась в том, что мне приходилось перенаправлять на сервер, если пользователь не вошел в систему или не имеет определенной роли. Вот как это делается, может быть, и вам это поможет:
import { gql } from 'apollo-boost'
import initApollo from '~/config/init-apollo'
import { Role } from '~/generated/apollo-components'
import { NextPage } from '~/node_modules/next'
import redirect from '~/utils/redirect'
import { parseCookies } from '~/utils/with-apollo'
const GET_USER_ROLE = gql`
query {
me {
role
}
}
`
export default (Page: NextPage<any>, allow: Role[]) => {
const originalGetInitialProps = Page.getInitialProps
let pageProps = {}
Page.getInitialProps = async (ctx) => {
if (originalGetInitialProps) {
pageProps = await originalGetInitialProps(ctx)
}
const apolloClient = initApollo(
{},
{ getToken: () => parseCookies(ctx.req).token },
)
try {
const { data } = await apolloClient.query({ query: GET_USER_ROLE })
if (!allow.includes(data.me.role as Role)) {
redirect(ctx, '/401')
}
return {
...pageProps,
}
} catch (e) {
console.info('error: ', e.graphQLErrors[0])
redirect(ctx, '/login')
}
}
return Page
}
Отличная идея ! Спасибо !