Next.js + react 中的路由守卫

Posted

技术标签:

【中文标题】Next.js + react 中的路由守卫【英文标题】:Route guards in Next.js + react 【发布时间】:2018-11-14 04:03:04 【问题描述】:

我有一个关于 Next.js 和 React 的项目,它不使用任何库进行路由。我应该如何为未经身份验证的用户实施路由保护(受保护的路由)?或者如果cookie中没有令牌,我应该重定向它们吗?

【问题讨论】:

【参考方案1】:

您可以通过一些适当的方式签入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 下面的所有嵌套路由呢?【参考方案2】:

我对此有很多问题,但最终成功解决了问题。

我正在使用 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.log('error: ', e.graphQLErrors[0])
      redirect(ctx, '/login')
    
  

  return Page

【讨论】:

以上是关于Next.js + react 中的路由守卫的主要内容,如果未能解决你的问题,请参考以下文章

使用 React-testing-library 进行测试时出现 Next.js 路由器错误

配置 React.js 路由以运行 next.js

react路由拦截(路由守卫)

使用带有 next.js 的反应路由器

使用react-router-dom@6,如何完成路由守卫这样的功能——使用高阶组件的包裹。

使用react-router-dom@6,如何完成路由守卫这样的功能——使用高阶组件的包裹。