【问题标题】:Universal Auth Redux & React Router通用 Auth Redux 和 React 路由器
【发布时间】:2016-04-28 04:48:18
【问题描述】:

我在使用 redux 和 react 路由器进行身份验证时遇到了一些问题,希望能澄清一下如何最好地解决我的问题。

我有一个登录组件,在提交时会调度以下操作:

export const loginUser = (creds) => {
  return dispatch => {

    dispatch(requestLogin(creds))

    return fetch('http://127.0.0.1:4000/api/login', {
      ...
    })
      .then(res => {
        dispatch(receiveLogin())
        browserHistory.push('/admin')
        ...
      })
      ...
  }
}

receiveLogin 操作将状态中的 isAuthenticated 标志更新为 true。我的受保护路线具有以下 onEnter 钩子:

export default (state) => {
  return {
    path: '/',
    component: App,
    childRoutes: [
      {
        path: 'protected',
        component: Protected,
        ...
        onEnter(nextState, replaceState) {
          const loggedIn = //check state.isAuthenticated
          if (!loggedIn) {
            replaceState(null, 'login')
          }
        }
      }
    ]
  }
}

如您所见,我将状态作为参数传入。这使我可以从服务器以及客户端访问初始状态。但是,在我的登录操作发生后,显然 onEnter 挂钩仍将使用初始状态。

我想知道的是在更新 isAuthenticated 标志后获取当前状态并在我的 onEnter 挂钩中使用它的最佳方法。或者,我的方法是否完全有缺陷,我应该完全采用不同的方式吗?

【问题讨论】:

    标签: reactjs react-router redux


    【解决方案1】:

    我发现在我的应用程序中使用 onEnter 钩子不是处理这种类型的身份验证逻辑和连接到 redux 存储的最佳方法。

    这里的一个(几个)陷阱是,即使您可以将用户登录到您的“受保护”路线,如果他们在“受保护”状态下注销,他们永远不会被重定向到“登录”,因为它不会t 触发 onEnter。

    另一种方法是使用高阶组件,请参阅 Dan Abramov 的 post 关于在 mixins 上使用它们,我发现它们在这种情况下也非常有用。那里有一些关于如何使用它们的要点/示例存储库,但我最近专门为此目的创建了一个库redux-auth-wrapper。它相当新,但我认为它可能很有用,并且在错误地使用 HOC 进行身份验证时避免了一些危险,这可能导致 infinite-loop-redirects。

    使用 HOC 的想法是,它是一种功能,当应用于组件时,它会以某种方式扩展其功能。 redux 的用户很可能熟悉 connect 以通过订阅商店来增强组件。

    在这种情况下,您编写的组件不知道受到身份验证/授权的保护,并且在应用 HOC 功能时,会返回具有给定检查的新组件。如果这些通过,则返回包装的组件,否则用户将被重定向到登录的地方(如果是授权问题,则重定向到其他地方)。 HOC 使用componentWillMount 和componentWillReceiveProps 生命周期方法来确定是否允许用户查看给定组件。这允许支持在身份验证更改时重定向出组件,即使路由没有更改。

    我还会在这里查看类似策略的示例:https://github.com/joshgeller/react-redux-jwt-auth-example。

    这是一个使用 onEnter 进行身份验证的示例,但我相信它不会处理上述边缘情况: https://github.com/CrocoDillon/universal-react-redux-boilerplate/blob/master/src/routes.jsx.

    【讨论】:

    • 我和 Andrew 有类似的问题,但我使用的是 HOC。我的问题是用户无法登录,因为它总是在服务器返回响应之前检查当前状态 - 这意味着用户无法登录。有没有办法限制 redux 商店中的检查?
    • @Abdi 是的,我在这里遇到了类似的问题:github.com/mjrussell/redux-auth-wrapper/issues/30。我认为解决方案是向您的 redux 存储 (isUserFetched) 或类似的东西添加一个标志,如果为真 - 不是执行重定向,而是在 HOC 中显示替代页面而不是包装组件。 (如加载页面)。我想尽快把它添加到我的图书馆,只是还没来得及
    • 我实际上已经设法解决了这个问题,而无需求助于中间页面。我使用了 redux- thunk - 这使操作等待解决,然后我更新状态,然后重定向。希望这是有道理的,但如果您有类似的问题,请务必查看redux-thunk。我还发现这个 repo 非常有用,因为它正在做我想做的事情 HOC with authentication
    • @Adbi 你能举一个关于你用来解决这个问题的 redux-thunk 实现的例子吗?我的问题是,如果用户在呈现受保护的视图之前刷新我想检查的页面
    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2018-02-14
    • 1970-01-01
    • 2018-10-03
    • 2020-06-11
    • 2018-07-01
    • 2020-08-13
    • 2017-12-16
    相关资源
    最近更新 更多