MongoDB更新用户时提示“You are not authenticated”的原因排查
问题:更新用户资料时返回"You are not authenticated"错误
我正在开发一款支持用户登录并更新个人资料的视频分享APP,后端已实现错误处理机制,但提交更新用户的PUT请求时触发了"You are not authenticated"错误。相关代码如下:
1. 路由配置
import express from 'express'; import { update} from '../controllers/user.js' import { verifyToken } from '../verifyToken.js'; const router = express.Router(); router.put("/:id", verifyToken, update);
2. 用户更新控制器
import { createError } from "../error.js"; import User from '../models/User.js' export const update = async (req, res, next) => { if(req.params.id === req.user.id) { try { const updatedUser = await User.findByIdAndUpdate(req.params.id, { $set: req.body }, {new: true}) res.status(200).json(updatedUser) } catch (error) { next(error) } } else { return next(createError(403, 'You can only update this account')); } }
3. 自定义错误处理
app.use((err, req, res, next) => { const status = err.status || 500 const message = err.message || "something went wrong" return res.status(status).json({ success: false, status, message }) }) export const createError = (status, message) => { const err = new Error() err.status=status err.message=message return err }
4. Token验证中间件
import jwt from 'jsonwebtoken' import { createError } from './error.js' export const verifyToken = (req, res, next) => { const token = req.cookies.acess_token if(!token) return next(createError(401, 'You are not authenticated')) jwt.verify(token, process.env.JWT, (err, user)=>{ if(err) return next(createError(403, "Token invalid")) req.user = user next() }) }
原因分析与解决办法
1. Cookie名称拼写错误
验证中间件中读取Cookie时写的是acess_token,正确拼写应为access_token(缺失了一个字母c)。这会导致后端无法从请求Cookie中读取到有效的Token,直接触发401未认证错误。
解决:
修正verifyToken中间件里的Cookie名称:
const token = req.cookies.access_token // 修正拼写错误
2. 前端请求未携带Cookie
前端发送PUT请求时,如果没有配置携带凭证的参数,浏览器不会自动把Cookie发送到后端,导致后端读取不到Token。
解决:
根据使用的HTTP客户端配置携带Cookie:
- Axios示例:
axios.put(`/api/users/${userId}`, updateData, { withCredentials: true })
- Fetch示例:
fetch(`/api/users/${userId}`, { method: 'PUT', body: JSON.stringify(updateData), credentials: 'include', headers: { 'Content-Type': 'application/json' } })
3. 后端未正确设置登录Cookie
登录接口生成JWT Token后,若没有将其存入名为access_token的Cookie,或者Cookie的属性(如httpOnly、secure、domain)配置错误,会导致前端无法获取或携带Token。
解决:
登录接口中正确设置Cookie:
// 登录成功生成Token后 res.cookie('access_token', token, { httpOnly: true, // 防范XSS攻击 secure: process.env.NODE_ENV === 'production', // 生产环境启用HTTPS时设置为true maxAge: 3600000, // Token有效期1小时 sameSite: 'lax' // 根据跨域情况调整,跨域时可设为'none'(需配合secure: true) })
4. Token生成逻辑不符要求
确保登录时生成的JWT Token使用了与verifyToken中间件一致的密钥(process.env.JWT),且Token的Payload中包含id字段,这样req.user.id才能正确获取并与请求参数中的id匹配。
内容的提问来源于stack exchange,提问作者Kobe Sutton
相关产品推荐
相关产品推荐

