You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS对接REST API实现授权token校验的实现方案咨询

实现方案

1. 封装通用token校验工具

先实现基础的校验逻辑,对接你提供的/validate接口,本地没有token时直接返回无效:

// /src/utils/auth.js
export const validateToken = async () => {
  const token = localStorage.getItem('auth_token')
  if (!token) return false
  try {
    const res = await fetch('/api/validate', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ token })
    })
    // 校验通过返回true,同时服务端自动重置token有效期,符合你的规则
    return res.ok
  } catch (err) {
    return false
  }
}

2. 封装私有路由组件(适配react-router v6主流版本)

把需要登录权限的页面统一用该组件包裹,每次路由切换时自动触发校验:

// /src/components/PrivateRoute.jsx
import { Navigate, Outlet, useLocation } from 'react-router-dom'
import { useState, useEffect } from 'react'
import { validateToken } from '../utils/auth'

const PrivateRoute = () => {
  const [isValid, setIsValid] = useState(null)
  const location = useLocation()

  useEffect(() => {
    const checkAuth = async () => {
      const valid = await validateToken()
      setIsValid(valid)
      if (!valid) localStorage.removeItem('auth_token')
    }
    checkAuth()
  }, [location.pathname]) // 路由路径变化时自动重新校验

  // 校验过程中显示加载态,避免页面内容闪烁
  if (isValid === null) return <div>权限校验中...</div>

  // 校验通过渲染子页面,否则跳转到登录页
  return isValid ? <Outlet /> : <Navigate to="/login" replace />
}

export default PrivateRoute

3. 路由配置中引入私有路由

所有需要登录才能访问的路由都作为私有路由的子项配置即可:

// /src/App.jsx
import { createBrowserRouter, RouterProvider } from 'react-router-dom'
import PrivateRoute from './components/PrivateRoute'
import LoginPage from './pages/Login'
import HomePage from './pages/Home'
import SettingPage from './pages/Setting'

const router = createBrowserRouter([
  { path: '/login', element: <LoginPage /> },
  // 权限路由统一嵌套
  {
    element: <PrivateRoute />,
    children: [
      { path: '/', element: <HomePage /> },
      { path: '/setting', element: <SettingPage /> }
    ]
  }
])

function App() {
  return <RouterProvider router={router} />
}

export default App

4. 全局请求拦截兜底

除了路由切换的校验,建议给所有业务接口加响应拦截,只要任意请求返回401就统一清理token跳登录,避免页面长时间停留未切换路由时token过期无法识别的问题:

// 以axios为例
import axios from 'axios'

axios.interceptors.response.use(
  (res) => res,
  (err) => {
    if (err.response?.status === 401) {
      localStorage.removeItem('auth_token')
      window.location.href = '/login'
    }
    return Promise.reject(err)
  }
)

如果你使用的是react-router v5版本,私有路由的封装语法稍有区别,核心校验逻辑完全一致可以复用。你的服务端token自动续期的规则刚好和路由切换触发校验的逻辑匹配,不需要额外开发续期功能。

内容的提问来源于stack exchange,提问作者M.K. aka Grisu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:06:01