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

使用routing-controllers实现Google OAuth时路由返回404问题求助

排查与解决方案

1. 检查Passport中间件挂载顺序

确保在初始化routing-controllers之前,先完成express-session(若依赖会话)、passport.initialize()和passport.session()的挂载。中间件顺序错误会导致Passport无法拦截请求:

import express from 'express';
import session from 'express-session';
import passport from 'passport';
import { useExpressServer } from 'routing-controllers';

const app = express();

// 先挂载会话中间件(按需)
app.use(session({ secret: 'your-secure-secret', resave: false, saveUninitialized: false }));
// 初始化Passport核心中间件
app.use(passport.initialize());
app.use(passport.session());

// 最后初始化routing-controllers
useExpressServer(app, {
  controllers: [__dirname + '/controllers/*.ts'],
});

2. 验证GoogleController的装饰器与逻辑

确认控制器的路由前缀和方法路径完全匹配,且必须调用passport.authenticate('google')触发授权跳转——仅打印请求会因无响应返回导致404:

import { Controller, Get } from 'routing-controllers';
import passport from 'passport';

@Controller('/api')
export class GoogleController {
  @Get('/auth-google')
  googleAuth() {
    // 触发Google OAuth授权流程,而非仅打印请求
    return passport.authenticate('google', { scope: ['profile', 'email'] });
  }

  // 必须配置回调路由,否则授权后会返回404
  @Get('/auth-google/callback')
  googleAuthCallback() {
    return passport.authenticate('google', {
      successRedirect: '/api/user',
      failureRedirect: '/api/login-fail'
    });
  }
}

3. 核对Google OAuth策略配置

确保Passport策略的callbackURL与Google Cloud Console中配置的授权回调地址完全一致,包括协议、域名和路径:

import passport from 'passport';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';

passport.use(new GoogleStrategy({
  clientID: process.env.GOOGLE_CLIENT_ID,
  clientSecret: process.env.GOOGLE_CLIENT_SECRET,
  callbackURL: 'http://localhost:3000/api/auth-google/callback' // 与Console配置严格匹配
}, (accessToken, refreshToken, profile, done) => {
  // 自定义用户逻辑:查找/创建用户等
  return done(null, profile);
}));

4. 无服务器环境适配检查

若使用AWS Lambda、Vercel等无服务器平台:

  • 用serverless-http等工具包裹Express应用,确保平台请求能正确转发到Express路由;
  • 避免使用内存会话,改用Redis等外部存储方案,防止会话状态丢失;
  • 检查平台路由配置(如Vercel的vercel.json),确保/api/*路径被正确映射到Express入口。

5. 排查依赖版本兼容性

执行npm ls express passport routing-controllers查看依赖版本树,确认各库版本无冲突。例如routing-controllers对Express版本有特定要求,版本不匹配会导致中间件无法正常触发。

内容的提问来源于stack exchange,提问作者Marcos Mariatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:17:14