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

开发环境Post请求正常,生产/测试环境提示token undefined问题排查

博客生产环境创建时Token识别401问题排查与修复

问题概述

开发博客应用时,创建新博客的token验证功能在开发环境正常,但生产环境返回401 unauthorised及token undefined错误,需定位token相关逻辑的问题并修复。

相关代码片段

前端token管理与创建博客请求

import axios from 'axios'
const baseUrl = '/api/blogs'

let token = null

const setToken = newToken => {
  token = `Bearer ${newToken}`
}

const create = async newObject => {
  const config = {
    headers: { Authorization: token },
  }

  const response = await axios.post(baseUrl, newObject, config)
  return response.data
}

前端创建博客调用逻辑

const blogFormRef = useRef()

const createBlog = (blogObject) => {
    blogFormRef.current.toggleVisibility()
    blogService
        .create(blogObject)
        .then(returnedBlog => {
            setBlogs(blogs.concat(returnedBlog))
            setErrorMessage(`A new blog ${blogObject.title} by ${blogObject.author} added`)
            setTimeout(() => {
                setErrorMessage(null)
            }, 5000)
        })
}

前端登录函数(含token设置)

const handleLogin = async (handleLogin) => {
    const username = handleLogin.username;
    const password = handleLogin.password;

  try {
      const user = await loginService.login({
          username, password,
      })

      window.localStorage.setItem(
          'loggedBlogappUser', JSON.stringify(user)
      )
      blogService.setToken(user.token)
      setUser(user)
      setErrorMessage('You are logged in!')
      setTimeout(() => {
          setErrorMessage(null)
      }, 5000)
  } catch (exception) {
      setErrorMessage('Wrong credentials')
      setTimeout(() => {
          setErrorMessage(null)
      }, 5000)
  }
}

后端路由与token验证逻辑

const blogsRouter = require('express').Router()
const Blog = require('../models/blog')
const User = require('../models/user')
const jwt = require('jsonwebtoken')

const getTokenFrom = request => {
  const authorization = request.get('authorization')
  if (authorization && authorization.startsWith('Bearer ')) 
  {
      return authorization.replace('Bearer ', '')
  }
  return null
}

blogsRouter.post('/', async (request, response) => {
  const body = request.body

  const decodedToken = jwt.verify(getTokenFrom(request), process.env.SECRET)
  if (!decodedToken.id) {
      return response.status(401).json({ error: 'token invalid' })
  }

  const user = await User.findById(decodedToken.id)

  const blog = new Blog ({
      title: body.title,
      author: body.author,
      url: body.url,
      likes: body.likes || 0,
      user: user._id
  })

  const savedBlog = await blog.save()
  user.blogs = user.blogs.concat(savedBlog._id)
  await user.save()

  response.status(201).json(savedBlog)
})

排查方向与修复建议

1. 页面刷新后Token丢失(核心大概率问题)

当前登录后仅将token存入内存变量token和localStorage,但应用初始化(如页面刷新)时未从localStorage恢复token,导致生产环境刷新页面后token变量重置为null,请求时未携带Authorization头。

修复: 在应用根组件(如App.js)中添加初始化逻辑,读取localStorage并设置token:

useEffect(() => {
  const loggedUserJSON = window.localStorage.getItem('loggedBlogappUser')
  if (loggedUserJSON) {
    const user = JSON.parse(loggedUserJSON)
    blogService.setToken(user.token)
    setUser(user)
  }
}, [])

2. 生产环境CORS与请求头配置问题

生产环境若前后端域名分离,需确保后端CORS配置允许Authorization请求头传递,否则浏览器会拦截该头,导致后端无法获取token。

检查: 后端CORS配置需包含Access-Control-Allow-Headers: Authorization,例如:

const cors = require('cors')
app.use(cors({
  allowedHeaders: ['Content-Type', 'Authorization']
}))

3. 后端环境变量SECRET配置

生产环境需确保process.env.SECRET已正确配置,若密钥缺失或与开发环境不一致,jwt.verify会抛出错误,间接导致token验证失败。

检查: 在后端启动脚本中设置环境变量,或使用.env文件(需确保生产环境加载该文件)。

4. 前端BaseUrl配置验证

生产环境需确认baseUrl指向正确的后端地址,若地址错误导致跨域或请求发送到无效地址,也会出现token未正确传递的情况。

验证: 查看生产环境网络请求的地址与请求头,确认Authorization头是否存在。


内容的提问来源于stack exchange,提问作者aks.asj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:24:57