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
相关产品推荐
相关产品推荐

