javascript - 如何在 React Router V4 上正确实现 JWT 身份验证路由

标签 javascript reactjs react-router jwt react-router-v4

使用 RR V4 文档,这是 PrivateRoute(或 AuthenticatedRoute)的示例代码

const AuthExample = () => (
  <Router>
    <div>
      <AuthButton/>
      <ul>
        <li><Link to="/public">Public Page</Link></li>
        <li><Link to="/protected">Protected Page</Link></li>
      </ul>
      <Route path="/public" component={Public}/>
      <Route path="/login" component={Login}/>
      <PrivateRoute path="/protected" component={Protected}/>
    </div>
  </Router>

PrivateRoute 可以实现为:

const PrivateRoute = ({ component: Component, ...rest }) => (

  let token - localStorage.getItem('jwtToken');

  <Route {...rest} render={props => (
    token ? (
      <Component {...props}/>
    ) : (
      <Redirect to={{
        pathname: '/login',
        state: { from: props.location }
      }}/>
    )
  )}/>
)

我的疑问是:

a) 检查 token 是否存储在本地以让应用程序渲染组件是否足够?

b) 如果 token 过期了,如何避免加载新组件?

c) 我是否应该在 PrivateRoute 开头调用服务器来检查 token 过期和有效性?这将在每次路由更改时增加到服务器的另一个往返。

d) 在不接触服务器的情况下验证 token 的正确方法是什么?

最佳答案

我不使用 React,但我对 JWT token 有一些经验。

恕我直言,客户端在任何时候都不应该有权访问 token 。它应该存储在 cookie 中,并在每次调用服务器时发送,服务器应该是唯一拥有解密它并访问其内容的 key 的人。您可以定义需要发送 token 的路由,通常类似于“/api/*”。

如果 token 正确,那么它会发送客户端期望的响应,如果不正确,它会告诉客户端重定向到/login (使用 401 或您喜欢的任何其他方式)。

如果 token 已过期(在向服务器请求某些内容时),您可以自动重新生成 key 或告诉客户端注销或告诉客户端向服务器请求新 key 或任何您认为最好的选择,您还可以有另一个 token “refresh_token”,仅用于重新创建“access_token”(这也是一个非常常见的解决方案)。

如果您需要,我可以详细说明。

关于javascript - 如何在 React Router V4 上正确实现 JWT 身份验证路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47227296/

相关文章:

javascript - React router 4 如何嵌套路由/admin 和/

ruby-on-rails - Heroku 路线上带有 React 应用程序的 Rails 无法在刷新时工作

javascript - 当登录状态处于组件状态时,如何使用 react-router 实现依赖于登录的路径?

reactjs - React-router "Cannot GET/*"除了根 url

javascript - 如何用 Jest 模拟第三方模块

javascript - 为什么用户数据没有使用fb登录存储到mysql中?

javascript - 如何在从 react 列表中呈现的已删除行上运行加载程序图标?

javascript - 如何使 Material UI react 按钮充当 react 路由器 DOM 链接?

javascript - 如何使用 JavaScript 或 jQuery 获取证书列表?

javascript - 在 JavaScript 中复制文件