You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

服务器Token验证成功后返回什么?中间件未执行next致API调用失败

问题分析与解决方案

1. 核心问题:必须调用next()推进请求流程

没错!你现在的问题完全是因为Token验证成功后没有调用next()

Express的中间件是链式执行的:每个中间件要么主动发送响应(比如res.json()res.redirect()),要么调用next()把请求传递给下一个中间件/路由。你的代码里,验证成功的分支只写了res.status(200),既没发送响应,也没调用next(),导致请求直接“卡”在了这个中间件里,后续的API路由根本没机会处理请求——这就是为什么移除验证函数后功能正常的原因。

2. Token验证成功后该返回什么?

其实这个全局验证中间件的职责是校验Token合法性,而不是返回业务数据。正确的做法是:

  • 把解析后的用户信息(也就是pay对象里的内容)挂载到req对象上,比如req.user = pay,这样后续的API路由可以直接获取用户身份信息,不用重复解析Token。
  • 然后调用next(),让请求继续流向对应的业务路由,由业务路由返回具体的响应内容。
  • 不需要在这个中间件里返回任何内容,否则会提前结束请求流程。

修改后的代码示例

app.use(verifyToken);

function verifyToken(req, res, next) {
  // 跳过/auth/google路径的验证
  if (req.path === '/auth/google') {
    return next(); // 加个return避免后续代码执行
  }

  // 注意:通常Authorization格式是"Bearer <token>",需要拆分出实际Token
  const authHeader = req.headers.authorization;
  if (!authHeader) {
    return res.status(401).json({ error: "Authorization header missing" });
  }
  const token = authHeader.split(' ')[1]; // 取出Bearer后面的Token

  client.verifyIdToken({
    idToken: token,
    audience: 'myClientId'
  }).then(pay => {
    // 将用户信息挂载到req上,后续路由可直接使用
    req.user = pay;
    // 关键:调用next()让请求继续往下走
    next();
  }).catch(err => {
    res.status(401).json({ error: err.message || "Invalid token" });
  });
}

补充说明你的登录流程

  • 对于/auth/google接口:它的职责是验证Token后重定向到/profile,所以这个接口本身应该在验证成功后执行res.redirect('/profile'),而你的全局中间件已经跳过了这个路径的校验,逻辑是对的。
  • 对于/profile页面的API调用:请求会经过这个验证中间件,Token校验通过后,next()会把请求传递给对应的API路由,API路由再返回页面需要的数据,这样第二个API调用就能正常执行了。

内容的提问来源于stack exchange,提问作者Vincent Nguyen

火山引擎 最新活动