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

NestJS+Passport谷歌认证仅获CODE未得Token问题求助

解决NestJS Passport谷歌认证回调仅收到CODE的问题

你的问题核心是Passport谷歌OAuth2策略的参数配置和validate方法参数顺序错误,导致守卫无法自动完成code换token的流程。以下是具体修复步骤:

1. 修正GoogleStrategy的validate方法参数顺序

你在策略里设置了passReqToCallback: true,这会让Passport把请求对象作为validate方法的第一个参数,但你当前的validate参数顺序完全错位,导致无法正确接收token数据。

修改后的策略validate方法:

import { Request } from 'express'; // 需要导入Request类型

async validate(
  req: Request, // 第一个参数是请求对象
  accessToken: string,
  refreshToken: string,
  profile: any,
  done: VerifyCallback,
): Promise<any> {
  const { name, emails } = profile;

  const user = {
    email: emails[0].value,
    firstName: name.givenName,
    lastName: name.familyName,
    accessToken,
    refreshToken, // 把refreshToken也存入user对象,方便后续使用
  };
  done(null, user);
}

2. 确认谷歌开发者控制台的回调URL配置

确保你在谷歌云平台的OAuth 2.0客户端ID配置中,授权重定向URI和代码里的callbackURL完全一致:

  • 代码里是http://localhost:3000/api/auth-google/callback,控制台里也要填一模一样的地址,包括HTTP协议、端口、完整路径
  • 如果前端和后端端口不同(比如前端3000,后端3001),回调URL要填后端的地址,因为是谷歌直接回调后端接口

3. 检查环境变量加载是否正常

确认你的GOOGLE_CLIENT_ID和GOOGLE_SECRET已经正确加载:

  • 确保NestJS的ConfigModule已经在AppModule中全局导入(比如ConfigModule.forRoot({ isGlobal: true })),这样ConfigService才能正确读取环境变量
  • 可以在GoogleStrategy的构造函数里打印验证:
    constructor(configService: ConfigService) {
      console.log('Google Client ID:', configService.get('GOOGLE_CLIENT_ID'));
      console.log('Google Secret:', configService.get('GOOGLE_SECRET'));
      super({
        // ...原有配置
      });
    }
    

额外说明

谷歌OAuth2的授权码流程本身就是先返回code,再由Passport策略自动用code向谷歌请求accessToken和refreshToken,所以回调接口收到code是正常现象,守卫会自动处理兑换流程,不需要你手动处理code。只要上述配置正确,守卫就能完成认证,并把用户信息注入到req.user中。

内容的提问来源于stack exchange,提问作者Filip Górny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:37:32