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

node后端-JWT认证

routes/auth.js

// src/routes/auth.js
import { Router } from 'express';
const router = Router();
import User from '../models/User.js';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import  { JWT_SECRET }  from '../config/config.js';// 注册 
router.post('/register', async (req, res) => {try {const { username, password,role } = req.body;const hashedPassword = await bcrypt.hash(password, 10);const response = await User.createUser(username, hashedPassword,role);if(typeof response === 'number'){res.status(201).json({ code:201,message: '注册成功!' });}else{res.status(500).json({ code:500,message: '用户名已存在!' });} } catch (error) {res.status(500).json({ code:500, message:"注册失败" });}
});// 登录  生成JWT令牌 Token
router.post('/login', async (req, res) => {try {const { username, password } = req.body; // 1.在数据库中查找是否存在这个账号const user = await User.findByUsername(username); // 2.控制台展示错误信息if (!user) {// 明确告知前端用户不存在return res.status(401).json({ error: '用户不存在' });}const isMatch = await bcrypt.compare(password, user.password);if (!isMatch) {// 明确告知前端密码错误return res.status(401).json({ error: '密码错误' });}// 3.生成JWT Token中包含用户的id和用户的角色字段const token = jwt.sign({ id: user.id,role:user.role }, JWT_SECRET, { expiresIn: '7d' });// 4.返回Token给前端res.json({ token,userinfo:{id:user.id,username:user.username,role:user.role,avatar:user.avatarUrl} });} catch (error) {res.status(500).json({ error: '登录失败' });}
});export default router;

前端发送请求的代码:

import axios from 'axios';
// import { ElMessage } from 'element-plus';
import {BASE_URL} from "../config.js"
import {useAllDataStore} from '@/stores/index'const API_URL = `${BASE_URL}/api/auth`;
const store=useAllDataStore();
export const register = async (userData) => {const response = await axios.post(`${API_URL}/register`, userData);return response.data;
};
// 登录 测试的接口是http://localhost:3000/api/auth/login
// 导出一个名为login的异步函数,接收一个参数credentials
export const login = async (credentials) => {// 使用axios发送post请求,请求地址为API_URL/login,请求参数为credentialsconst response = await axios.post(`${API_URL}/login`, credentials);console.log(response.data);localStorage.setItem('token', response.data.token);// store.updateMenuList(generateMenuByRole(response.data.userinfo.role));store.state.token=response.data.token;store.state.avatar=response.data.userinfo.avatar;return response.data;
};
// 获取用户信息
export const getCurrentUser = () => {const token = localStorage.getItem('token');return token ? JSON.parse(atob(token.split('.')[1])) : null;
};

模块函数:

// src/models/User.js
import pool from '../config/db.js';
class User {// 创建用户(只需要用户名和密码)static async createUser(username, password,role) {try{console.log('数据库连接状态检查...');const [rows] = await pool.execute('INSERT INTO users (username, password,role) VALUES (?, ?, ?)',[username, password,role]);console.log('数据库操作成功:', rows.insertId);return rows.insertId;}catch(error){console.error('数据库操作失败:', error);return error;}}// 通过用户名查找用户static async findByUsername(username) {const [rows] = await pool.execute('SELECT * FROM users WHERE username = ?', [username]);return rows[0];}
}export default User;

server.js记得加:

app.use('/api/auth',authRoutes);

http://www.xdnf.cn/news/16497.html

相关文章:

  • Java面试宝典:MySQL事务和事务的隔离级别
  • 《中国棒球》cba球队有哪些球队·棒球1号位
  • qt 心跳包
  • ICPC 2024 网络赛(I)
  • 2.DRF 序列化器-Serializer
  • 如何规范化项目执行
  • 学习Python中Selenium模块的基本用法(2:下载浏览器驱动)
  • Solidity基础(教程④-ERC-4626收益金库)
  • 机器学习sklearn:不纯度与决策树构建
  • Python Pandas.merge_ordered函数解析与实战教程
  • 网络编程概述与UDP编程
  • Faiss 向量数据库详解
  • Redis反弹Shell
  • 【Java基础面试题】Java特点,八种基本数据类型
  • 《Java 程序设计》第 8 章 - Java 常用核心类详解
  • 用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?
  • 设计模式实战:自定义SpringIOC(亲手实践)
  • 【VUE3】搭建项目准备工作
  • 04动手学深度学习(下)
  • 【SpringMVC】MVC中Controller的配置 、RestFul的使用、页面重定向和转发
  • 图论(BFS)构造邻接表(运用队列实现搜索)
  • 【动态规划 | 路径问题】动态规划方法:解决路径问题的最佳策略
  • Java学习-----JVM的垃圾回收算法
  • mac电脑如何关闭防火墙
  • Datawhale AI夏令营记录
  • 第二十二节 MATLAB转置向量、MATLAB追加向量
  • v4l2_ctrl_handler_setup()函数详解
  • JavaWeb 新手学习路线:从零到全栈开发,系统掌握企业级 Web 开发技能
  • 智能制造--EAP设备自动化程序
  • Ubuntu “apt”安装