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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:24:18