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

EC2构建NestJS Docker镜像时OAuth2环境变量配置错误

问题:Docker Compose环境变量未加载导致OAuth2Strategy缺少clientID参数

错误日志

[Nest] 1  - 07/07/2024, 9:31:03 AM   ERROR [ExceptionHandler] OAuth2Strategy requires a clientID option
TypeError: OAuth2Strategy requires a clientID option
    at GoogleStrategy.OAuth2Strategy (/usr/src/app/node_modules/passport-oauth2/lib/strategy.js:83:34)
    at new Strategy (/usr/src/app/node_modules/passport-google-oauth20/lib/strategy.js:52:18)
    at new MixinStrategy (/usr/src/app/node_modules/@nestjs/passport/dist/passport/passport.strategy.js:32:13)
    at new GoogleStrategy (/usr/src/app/dist/auth/utils/strategies/google.strategy.js:23:9)
    at Injector.instantiateClass (/usr/src/app/node_modules/@nestjs/core/injector/injector.js:365:19)
    at callback (/usr/src/app/node_modules/@nestjs/core/injector/injector.js:65:45)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Injector.resolveConstructorParams (/usr/src/app/node_modules/@nestjs/core/injector/injector.js:144:24)
    at async Injector.loadInstance (/usr/src/app/node_modules/@nestjs/core/injector/injector.js:70:13)
    at async Injector.loadProvider (/usr/src/app/node_modules/@nestjs/core/injector/injector.js:97:9)

相关配置代码

docker-compose.yaml

version: '3'

services:
  backend:
    build: ./
    container_name: EZCryptoExchange
    environment:
      - GOOGLE_CLIENTID=XXXXXXX.apps.googleusercontent.com
      - GOOGLE_SECRET=XXXXXXXXX
      - APP_PORT=3001
      - GOOGLE_CALLBACK_URL="http://localhost:3001/api/auth/google/redirect"
      - KAKAO_CLIENTID=XXXXXXXXXX
      - KAKAO_SECRET=XXXXXXXXX
      - KAKAO_CALLBACK_URL="http://localhost:3001/api/auth/kakao/redirect"
      - SESSION_SECRET=XXXXXXXXXXXXXXX
      - KAKAOPAY_SECRET=XXXXXXXXXXXXXX
    ports:
      -"3001:3001"

GoogleStrategy实现代码

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy) {
    constructor(
        private readonly configService: ConfigService,
        @Inject('AUTH_SERVICE') private readonly authService: AuthService,
    ) {
        super({
            clientID: process.env.GOOGLE_CLIENTID,
            clientSecret: process.env.GOOGLE_SECRET,
            callbackURL: process.env.GOOGLE_CALLBACK_URL,
            scope: ['profile', 'email'],
        });    
    }

    async validate(accessToken: string, refreshToken: string, profile: Profile) {
        console.log(profile)
        const user = await this.authService.validateUser({
            email: profile.emails[0].value, 
            displayName: profile.displayName, 
            walletPrivateKey: "1", 
            walletAddress: "1"
        })
        return user || null; 
    }
}

排查与解决方法

1. 修复docker-compose.yaml格式错误

配置文件存在两处语法问题,直接导致环境变量无法正常解析:

  • 端口映射缺少空格:ports字段下的-"3001:3001"需改为- "3001:3001"
  • 环境变量引号转义错误:GOOGLE_CALLBACK_URL和KAKAO_CALLBACK_URL中的"是无效转义,直接去掉引号(值无空格时无需引号)或使用普通双引号即可。

修正后的关键配置片段:

environment:
  - GOOGLE_CLIENTID=XXXXXXX.apps.googleusercontent.com
  - GOOGLE_SECRET=XXXXXXXXX
  - APP_PORT=3001
  - GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/redirect
  - KAKAO_CLIENTID=XXXXXXXXXX
  - KAKAO_SECRET=XXXXXXXXX
  - KAKAO_CALLBACK_URL=http://localhost:3001/api/auth/kakao/redirect
  - SESSION_SECRET=XXXXXXXXXXXXXXX
  - KAKAOPAY_SECRET=XXXXXXXXXXXXXX
ports:
  - "3001:3001"

2. 验证容器环境变量是否生效

启动容器后,执行以下命令进入容器检查环境变量:

docker exec -it EZCryptoExchange env

确认输出中存在GOOGLE_CLIENTID等配置的变量,若不存在则需重新检查docker-compose配置格式。

3. 排查Dockerfile是否干扰环境变量

若Dockerfile中存在COPY .env .或ENV指令覆盖相关变量,会导致docker-compose的环境变量失效。确保Dockerfile未复制本地.env文件到容器,也未手动设置冲突的环境变量。

4. (可选)统一使用NestJS ConfigService读取变量

代码中已注入ConfigService但未使用,建议通过它读取环境变量,避免直接依赖process.env,同时确保根模块正确配置ConfigModule:

// 根模块配置
@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true })],
})
export class AppModule {}

// GoogleStrategy中修改为ConfigService读取
super({
  clientID: this.configService.get('GOOGLE_CLIENTID'),
  clientSecret: this.configService.get('GOOGLE_SECRET'),
  callbackURL: this.configService.get('GOOGLE_CALLBACK_URL'),
  scope: ['profile', 'email'],
});

内容的提问来源于stack exchange,提问作者김민겸

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:00:12