用户注册时出现Error 403问题,请求协助排查解决
解决注册接口403错误问题
问题概述
开发包含用户注册功能的Web应用时,提交注册表单后浏览器控制台返回403错误,用户无法完成注册。
错误原因
在app.js中全局挂载了JWT认证中间件authMiddleware.authenticateToken,导致所有接口请求(包括注册、登录这类无需认证的接口)都要求携带有效Token。但注册流程中用户还未生成Token,因此服务器直接返回403权限错误。
修复方案
移除全局认证中间件的挂载,仅为需要认证的接口单独添加该中间件,注册和登录接口不需要校验Token。
修改后的代码示例
更新app.js
const mongoose = require("mongoose"); const cors = require("cors"); const dotenv = require('dotenv'); const cookieParser = require("cookie-parser") const authMiddleware = require('./middlewares/authMiddleware'); const authRoutes = require('./routes/routes'); const User = require('./models/user'); const app = express(); dotenv.config(); app.use(express.json()); app.use(cookieParser()); app.use(cors({ origin: 'http://127.0.0.1:5173' })); const url = process.env.MONGO_URL; mongoose .connect(url, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log("Connected to MongoDB database!"); }) .catch((error) => { console.error("Failed to connect to MongoDB Atlas:", error); }); // 移除全局认证中间件 // app.use(authMiddleware.authenticateToken); app.use('/api/auth', authRoutes); // 给需要认证的测试接口单独添加中间件 app.get('/test', authMiddleware.authenticateToken, (req,res) => { res.json("test ok"); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
(可选)在路由文件中配置认证中间件
如果有需要认证的接口,可以在routes/routes.js中为特定路由添加中间件,示例如下:
const express = require('express'); const router = express.Router(); const authController = require('../controllers/authController'); const authMiddleware = require('../middlewares/authMiddleware'); // 注册、登录接口无需认证 router.post('/register', authController.registerUser); router.post('/login', authController.loginUser); // 需要认证的接口添加中间件 router.get('/profile', authMiddleware.authenticateToken, (req, res) => { res.json({ user: req.user }); }); module.exports = router;
验证修复
修改后重新启动后端服务,提交注册表单即可正常完成注册流程,服务器会返回201状态码,前端可跳转到登录页面。
内容的提问来源于stack exchange,提问作者user16009462
相关产品推荐
相关产品推荐

