【问题标题】:React-Redux authentication with JWT使用 JWT 进行 React-Redux 身份验证
【发布时间】:2020-07-05 22:18:24
【问题描述】:

我正在尝试为我的 React 应用程序构建一个登录系统。我正在使用 React、Redux、Redux-Thunk 和 React Router。登录后,我将 JWT 存储在本地存储中。

问题是我在返回网站后找不到“重新验证”用户的好方法。调用动作创建者来获取用户数据是一个好地方吗?现在我只是检查本地存储中是否有令牌,并更改我的减速器中的值。但是你会在哪里实现获取用户配置文件的逻辑呢?这是我附加的主要组件。

import React from 'react'
import MainCallPage from './MainCallPage'
import LoginPage from './LoginPage'
import HeaderComponent from './HeaderComponent'
import MainPage from './MainPage'
import PrivateRoute from './PrivateRoute'
import { Router, Route } from 'react-router-dom'
import { Provider } from 'react-redux'
import { createStore, applyMiddleware, compose } from 'redux'
import rootReducer from '../reducers'
import thunkMiddleware from 'redux-thunk'
import { history } from '../helpers/history'

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose

const store = createStore(
  rootReducer,
  composeEnhancers(applyMiddleware(thunkMiddleware))
)

const token = localStorage.getItem('token')
if (token) {
  store.dispatch({ type: 'AUTH_USER' })
}

const App = () => {
  return (
    <Provider store={store}>
      <Router history={history}>
        <HeaderComponent />
        <PrivateRoute path="/dashboard" component={MainCallPage}></PrivateRoute>
        <Route path="/login" component={LoginPage} />
        <Route path="/" component={MainPage} exact />
      </Router>
    </Provider>
  )
}

export default App

【问题讨论】:

  • 您可以创建一个包装您的应用程序的高阶组件,并对来自 localStorage 的令牌执行检查以及获取用户(它将包装 Router 组件的所有子组件),或者在自定义钩子中有相同的东西。

标签: reactjs authentication redux


【解决方案1】:

我认为当前方法没有任何问题,但是由于您使用的是功能组件,我建议您使用useEffect 挂钩并检查token 是否存在于localStorage 中,如果它存在你想要然后获取用户数据

import React,{useEffect} from "react";

useEffect(() => {
  const token = localStorage.getItem('token')
  if (token) {
   store.dispatch({ type: 'AUTH_USER' })
    //Fetch Data
   }  
  }, [token])

【讨论】:

  • 但是我仍然需要重构一个 HOC 来包装我猜的所有内容?问题是现在在 APP 组件中我无法调用 redux 操作,因为我在 Provider 标签之外。还是有其他方法可以做到这一点?有什么好的做法吗?
  • 我认为将上述代码放在您的 HeaderComponent 中应该可以解决问题,因为它似乎在每条路线中都是一致的,而且您还想将您的 Routes 包装在 Switch 中。
  • 这方面有什么好的做法吗?老实说,我不知道,但我认为这取决于程序化方法而不是其他任何东西,例如,我什至会使用非常不同的结构来设置 redux
猜你喜欢
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2016-04-07
  • 2020-09-03
  • 2023-03-27
  • 2021-05-29
  • 2017-07-30
  • 2018-06-30
相关资源
最近更新 更多