当前位置: 首页 > news >正文

React 实现 JWT 登录验证的最小可运行示例

下面是一个用 React 实现 JWT 登录验证的最小可运行示例,包含:

  • React 前端:登录、保存 Token、获取用户数据。
  • 模拟后端:用 mock API(你也可以接真后端)。

🧱 技术栈

  • React(使用 Vite)
  • axios 发送请求
  • localStorage 保存 JWT
  • 使用一个假的后端 API(模拟 JWT 认证)

🚀 最终效果

  1. 用户输入用户名和密码登录;
  2. 服务器返回 JWT;
  3. 前端保存 JWT;
  4. 访问受保护的用户信息页时,携带 JWT 请求头访问。

🛠️ 第一步:初始化项目

npm create vite@latest jwt-demo -- --template react
cd jwt-demo
npm install
npm install axios

在这里插入图片描述


📁 目录结构

src/
├─ App.jsx
├─ pages/
│  ├─ Login.jsx
│  └─ Profile.jsx
├─ api.js
└─ main.jsx

✏️ 第二步:代码实现

🔹 src/api.js(模拟 API)

import axios from 'axios';const mockToken = "fake-jwt-token-123456";export async function login(username, password) {if (username === 'admin' && password === '123456') {return { token: mockToken };} else {throw new Error('登录失败');}
}export async function getProfile(token) {if (token === mockToken) {return { username: 'admin', email: 'admin@example.com' };} else {throw new Error('无效Token');}
}

🔹 src/pages/Login.jsx

import { useState } from 'react';
import { login } from '../api';export default function Login({ onLogin }) {const [username, setUsername] = useState('');const [password, setPassword] = useState('');const [error, setError] = useState('');const handleLogin = async () => {try {const res = await login(username, password);localStorage.setItem('token', res.token);onLogin();} catch (e) {setError('用户名或密码错误');}};return (<div><h2>登录</h2><input placeholder="用户名" value={username} onChange={e => setUsername(e.target.value)} /><br /><input type="password" placeholder="密码" value={password} onChange={e => setPassword(e.target.value)} /><br /><button onClick={handleLogin}>登录</button>{error && <p style={{ color: 'red' }}>{error}</p>}</div>);
}

🔹 src/pages/Profile.jsx

import { useEffect, useState } from 'react';
import { getProfile } from '../api';export default function Profile() {const [profile, setProfile] = useState(null);const [error, setError] = useState('');useEffect(() => {const token = localStorage.getItem('token');getProfile(token).then(data => setProfile(data)).catch(err => setError('认证失败,请重新登录'));}, []);if (error) return <p>{error}</p>;if (!profile) return <p>加载中...</p>;return (<div><h2>用户信息</h2><p>用户名: {profile.username}</p><p>邮箱: {profile.email}</p></div>);
}

🔹 src/App.jsx

import { useState } from 'react';
import Login from './pages/Login';
import Profile from './pages/Profile';export default function App() {const [isLoggedIn, setIsLoggedIn] = useState(!!localStorage.getItem('token'));const handleLogout = () => {localStorage.removeItem('token');setIsLoggedIn(false);};return (<div>{isLoggedIn ? (<><Profile /><button onClick={handleLogout}>退出登录</button></>) : (<Login onLogin={() => setIsLoggedIn(true)} />)}</div>);
}

✅ 运行

npm run dev

在这里插入图片描述

访问 http://localhost:5173,输入:

  • 用户名:admin
  • 密码:123456

然后你将登录并看到用户信息页,JWT 被保存在 localStorage


后面重启后就不用再输入密码了
在这里插入图片描述

相关文章:

  • Oracle EBS FORM快捷键与触发器的关系与使用
  • 永久免费的小工具,内嵌微软接口
  • 二叉搜索树的插入操作(递归遍历)
  • C语言 指针(9)
  • 动态SQL与静态SQL
  • 10.王道_HTTP
  • 【AI论文】FlexiAct:在异构场景中实现灵活的动作控制
  • Spring Boot 实现验证码生成与校验:从零开始构建安全登录系统
  • 并发与并行的关系
  • 如何防止域名DNS被劫持?
  • 【Go】优化文件下载处理:从多级复制到零拷贝流式处理
  • 极狐GitLab 容器镜像仓库功能介绍
  • 电池分压电阻检测不准的原因
  • AI日报 · 2025年5月08日|Stripe发布全球首个支付AI基础模型
  • 山东136号文实施方案与竞价细则
  • Ubuntu18.04 设置开机服务自启
  • 关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题
  • 移植easylogger通过J-Linker的RTT输出日志/Ozone的RTT设置
  • sui在windows虚拟化子系统Ubuntu和纯windows下的安装和使用
  • 【嵌入式开发-USB】
  • “一嗨租车”陷“五年后扣费”疑云,用户:违章处理莫名消失
  • 壹基金发布2024年度报告,公益项目惠及937万人次
  • 一季度全国消协组织为消费者挽回经济损失23723万元
  • 全国铁路五一假期累计发送1.51亿人次,多项运输指标创历史新高
  • 长三角多地重启游轮跨市游,“恢复苏杭夜航船”呼声又起
  • 金正恩视察重要军工企业要求推进武力强化变革