nest.js 中的环境变量在 jwt.strategy.ts 中不可见

Posted

技术标签:

【中文标题】nest.js 中的环境变量在 jwt.strategy.ts 中不可见【英文标题】:Environment variable in nest.js is not visible in jwt.strategy.ts 【发布时间】:2021-07-11 17:47:59 【问题描述】:

我正在尝试将环境变量传递给我的 jwt.stratgy.ts 文件,但变量在文件中不可见。如果我在 SecurityParameters 文件中硬编码 jwksUri 变量,它工作正常。由于某种原因,似乎 process.env 在 super(options) 甚至在 constructor() 中都不可见。希望有任何关于如何读取变量的指针。

我的 jwt.strategy.ts 如下所示:

import  PassportStrategy  from '@nestjs/passport';
import  ExtractJwt, Strategy  from 'passport-jwt';
import  passportJwtSecret  from 'jwks-rsa';
import  SecurityParameters  from '../auth.parameters' ;
import  ConfigService  from  '@nestjs/config' ;

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) 
  constructor(  configService: ConfigService ) 

  
    super(
      secretOrKeyProvider: passportJwtSecret(
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5,
        jwksUri: configService.get<string>('jwksUri'),
      ),
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      audience: SecurityParameters.audience ,
      issuer: SecurityParameters.issuer,
      ignoreExpiration: false,
      algorithms: ['RS256'],
    );
  

  


我的 SecurityParameters 文件如下所示:

export const SecurityParameters = 
        issuer : process.env.ISSUER ,
        secret: process.env.SECRET ,
        expiresin: process.env.EXPIRESIN,
        jwksUri: process.env.JWKSURI,
        
   ;


我正在从 .env 文件加载环境文件并在 main.ts 中加载环境变量

import  NestFactory  from '@nestjs/core';
import  SwaggerModule, DocumentBuilder  from '@nestjs/swagger';
import  AppModule  from './app.module';
import * as dotenv from 'dotenv';



async function bootstrap() 

  const app = await NestFactory.create(AppModule);

  await app.listen(port, () => 
    console.log(`Listening on port $port`);
  );



dotenv.config();

bootstrap();

我的 app.module.ts 如下所示


import  Module  from '@nestjs/common';
import  UserModule  from './user/user.module';
import  ConfigModule  from '@nestjs/config';
import  AuthModule  from './auth/auth.module';
import  config  from './auth/config';

let environment = process.env.NODE_ENV || 'local' ;
var module_names: Array<any> = [
  AuthModule
]

if (environment=='local') 
  module_names.push(ConfigModule.forRoot( 
    isGlobal: true,
    load: [config],
   ))


@Module(
  imports: 
    module_names,
    controllers: [],
    providers: [],
)

export class AppModule 

config.ts

const config = (): any => 
    return 
        issuer : process.env.ISSUER ,
        secret: process.env.SECRET ,
        expiresin: process.env.EXPIRESIN,
        jwksUri: process.env.JWKSURI,
       
    ;
 ;
 
 export  config ;

【问题讨论】:

【参考方案1】:

As I just mentioned in your other question 你应该注入ConfigService 并使用configService.get() 而不是process.env 来获取你的环境变量。

【讨论】:

谢谢。我在 main.ts 中添加了 dotenv 方法,但它不起作用 import config from 'dotenv';配置()。由于某种原因,它使它在大多数模块中可用,但在构造函数()中不可用'无法添加配置服务,因为 this.configService.get('JWKSURI') 在 super() 构造函数中不可用。 没用:``` export class JwtStrategy extends PassportStrategy(Strategy) constructor( configService: ConfigService ) super( secretOrKeyProvider: passportJwtSecret( cache: true, rateLimit: true, jwksRequestsPerMinute: 5, jwksUri:configService.get('JWKSURI'), ),jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),受众:SecurityParameters.audience,发行者:configService.get('ISSUER'),ignoreExpiration:false,算法: ['RS256'], ); “没用”并没有说明它是怎么没用的。此外,代码块格式在 cmets 中不起作用。请将更新后的代码添加到您的问题中,以便我们更好地了解我们正在查看的内容,并具体说明问题的原因。 感谢您的关注。我更新了上面的代码。我想知道我的 config.ts 在 jwt.strategy 被实例化时是否有 process.env.JWKSURI 可见。如果我在 config.ts 中对变量进行硬编码,它可以正常工作。 谢谢。我意识到我的 env 变量中有一个类型,这使它失败。非常感谢

以上是关于nest.js 中的环境变量在 jwt.strategy.ts 中不可见的主要内容,如果未能解决你的问题,请参考以下文章

使用nest.js在AWS Lambda中获取Cognito数据(即requestContext)

Nest.js 中的 Socket.io 确认

Nest.js 模型依赖注入与 Mongoose 没有构造函数

如何在 Nest.js 中删除 @ManyToMany 关系中的数据

有啥方法可以在不使用 Nest.js 中的 async/await 的情况下从数据库中获取数据?

Nest.js:如何覆盖导入模块中的提供程序?