首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >secretOrPrivateKey必须有一个值(硬编码秘密的\没有未定义的值)

secretOrPrivateKey必须有一个值(硬编码秘密的\没有未定义的值)
EN

Stack Overflow用户
提问于 2022-10-10 16:09:18
回答 1查看 62关注 0票数 0

PS :我测试了这些:Error: secretOrPrivateKey must have a value

我有在另一个项目中工作的这些代码,我将它们完全复制-粘贴到另一个具有相同依赖关系版本的新项目中,它显示了这个错误。当我像这样调用符号函数时,会发生错误:

代码语言:javascript
复制
await this._jwtTokenService.signAsync(user),

在构造函数中注入_jwtTokenService,如下所示:

代码语言:javascript
复制
  constructor(
private _jwtTokenService: JwtService,
) {}

我以前看到过这个错误,但修复方法是在jwtModule.register函数中注入“秘密”,如下所示:

代码语言:javascript
复制
JwtModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => {
    return {
      secret: 'secret',
    };
  },
  inject: [ConfigService],
}), `

但是现在不行了,除非我对符号函数这样做

代码语言:javascript
复制
await this._jwtTokenService.signAsync(user, {secret : 'secret'}),

当我打印_jwtTokenService以查看它所继承的值时,我看到它有空的options对象:

代码语言:javascript
复制
JwtService {
 options: {},
 logger: Logger { context: 'JwtService', options: {} }
  }

例如,我尝试将其传递到寄存器函数中:

代码语言:javascript
复制
  signOptions: { expiresIn: '30 days' },

它仍然有空的对象。我在这里做错什么了吗?

代码语言:javascript
复制
 "dependencies": {
"@nestjs/common": "^8.0.0",
"@nestjs/config": "^2.2.0",
"@nestjs/core": "^8.0.0",
"@nestjs/jwt": "^9.0.0",
"@nestjs/mapped-types": "*",
"@nestjs/microservices": "^9.1.4",
"@nestjs/mongoose": "^9.2.0",
"@nestjs/passport": "^9.0.0",
"@nestjs/platform-express": "^8.0.0",
"@nestjs/swagger": "^6.1.2",
"@types/passport-jwt": "^3.0.6",
"bcrypt": "^5.1.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",
"express-session": "^1.17.3",
"mongoose": "^6.6.5",
"passport": "^0.6.0",
"passport-jwt": "^4.0.0",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.2.0"
 },

auth.module.ts

代码语言:javascript
复制
    @Module({
     imports: [
    UsersModule,

    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'secret', //to add .env
      secretOrPrivateKey: 'secret',
      signOptions: { expiresIn: '30 days' },
    }),
  ],
  providers: [AuthService, SessionSerializer, JwtService],
  exports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    AuthService,
    PassportModule,
    JwtModule,
     ],
    })
     export class AuthModule {}

在auth.services.ts中:

代码语言:javascript
复制
  async loginWithCredentials(user: UserDto) {
    const userEntity: UserDto = await this.validateUser(
      user.username,
      user.password,
    );
    const token = await this.createToken(userEntity);

    return new LoginPayloadDto(token);
  }

  async createToken(user: UserDto): Promise<TokenDto> {
    console.log(user);
    return new TokenDto({
      expiresIn: 30,
      accessToken: await this._jwtTokenService.signAsync(user),
    });
  }

我在应用程序控制器中使用了auth服务:

代码语言:javascript
复制
  @Post('login')
  async loginHttp(@Body() user: UserDto) {
    return this.authService.loginWithCredentials(user);
  }

app.module:

代码语言:javascript
复制
@Module({
  imports: [
    ConfigModule.forRoot({
      load: configs,
      isGlobal: true,
      cache: true,
      envFilePath: ['.env'],
      expandVariables: true,
    }),
    MongooseModule.forRoot(`mongodb://localhost:27017/admin`),
    UsersModule,
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService],
  exports: [],
})
export class AppModule {}

ps :即使我把配置放在app模块中,它也不起作用。

我得到的错误:

代码语言:javascript
复制
[Nest] 84469  - 10/10/2022, 5:21:48 PM   ERROR [ExceptionsHandler] secretOrPrivateKey must have a value
Error: secretOrPrivateKey must have a value
    at Object.module.exports [as sign] (/media/work/alternatives-matomo/in-auth/node_modules/jsonwebtoken/sign.js:107:20)
    at /media/work/alternatives-matomo/in-auth/node_modules/@nestjs/jwt/dist/jwt.service.js:33:53
    at new Promise (<anonymous>)
    at JwtService.signAsync (/media/work/alternatives-matomo/in-auth/node_modules/@nestjs/jwt/dist/jwt.service.js:33:16)
    at AuthService.createToken (/media/work/alternatives-matomo/in-auth/src/auth/auth.service.ts:56:48)
    at AuthService.loginWithCredentials (/media/work/alternatives-matomo/in-auth/src/auth/auth.service.ts:47:30)
    at /media/work/alternatives-matomo/in-auth/node_modules/@nestjs/core/router/router-execution-context.js:46:28
    at /media/work/alternatives-matomo/in-auth/node_modules/@nestjs/core/router/router-proxy.js:9:17
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-10 16:42:18

将JwtService从auth.module提供程序列表中删除,修复了它

代码语言:javascript
复制
        @Module({
     imports: [
    UsersModule,

    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'secret', //to add .env
      secretOrPrivateKey: 'secret',
      signOptions: { expiresIn: '30 days' },
    }),
  ],
  providers: [AuthService, SessionSerializer],
  exports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    AuthService,
    PassportModule,
    JwtModule,
     ],
    })
     export class AuthModule {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74017744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档