prosource

오류: secretOrPrivateKey에 값이 있어야 합니다.

probook 2023. 9. 20. 20:25
반응형

오류: secretOrPrivateKey에 값이 있어야 합니다.

jwt를 사용하여 토큰을 생성하고 있지만, 우체부를 통해 로그인하면 콘솔에서 "Error: secretOrPrivateKey have a value"라는 오류가 나타납니다.로그인 코드를 첨부하였습니다.나를 도와줄 수 있는 사람은 누구든.

exports.login = (req, res, next) => {
  User.findOne({
    where: {
      email: req.body.email
    }
  })
    .then(user => {
      if (!user) {
        return res.status(401).json({
          message:
            "Auth failed!! either the account does't exist or you entered a wrong account"
        });
      }
      bcrypt.compare(req.body.password, user.password, (err, result) => {
        if (err) {
          return res.status(401).json({
            message: "Auth failed",
            token: token
          });
        }
        if (result) {
          const token = jwt.sign(
            {
              email: user.email,
              password: user.id
            },
            process.env.JWT_KEY,
            {
              expiresIn: "1h"
            }
          );

          res.status(200).json({
            message: "Auth granted, welcome!",
            token: token
          });
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
};

이것은 나의 env.json파일입니다.

{
    "env":{
        "MYSQL":"jllgshllWEUJHGHYJkjsfjds90",
        "JWT_KEY": "secret"
    }
}

enter image description here

enter image description here

애플리케이션에서 환경 변수를 제대로 읽을 수 없는 것 같습니다.

어떤 패키지를 사용하여 환경 변수를 로드하는지 모르겠지만 가장 간단한 방법은 dotenv 패키지를 사용하는 것입니다.

npm i dotenv로 설치한 후 다음과 같이 응용프로그램 메인 파일로 최대한 빨리 가져옵니다.

require("dotenv").config();

이 컨텐츠를 사용하여 응용 프로그램 루트 폴더에 .env 파일을 만듭니다(형식이 key=value임을 알 수 있음).

MYSQL=jllgshllWEUJHGHYJkjsfjds90
JWT_KEY=secret

그러면 이미 했던 것처럼 해당 값에 액세스할 수 있습니다.

process.env.JWT_KEY

.env 파일:

enter image description here

process.env 를합니다 프로세스를 합니다. 됩니다: JWT_SECRET_KEY 합니다.${process.env.JWT_SECRET_KEY}등딱지로 싸다 그것해 주었습니다.그것은 저에게 그 문제를 해결해 주었습니다.

NestNest 와에서 이 했습니다. JS에 할 때 process.env.X 거예요.@nestjs/config사용하다dotenv배경에 있는데 생각보다 잘 안 되네요.나는 사용해야만 했습니다.ConfigService합니다를 합니다.dotenv지정된 파일에서 다음을 수행합니다.

jwt.strategy.ts

import * as dotenv from 'dotenv';
dotenv.config();

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      secretOrKey: process.env.JWT_SECRET,
    });
  }
}

아니면

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(configService: ConfigService) {
    super({
      secretOrKey: configService.get<string>('JWT_SECRET'),
    });
  }
}

auth.module.ts

import * as dotenv from 'dotenv';
dotenv.config();

@Module({
  imports: [
    JwtModule.register({
      secret: process.env.JWT_SECRET,
    }),
  ],
})

아니면

@Module({
  imports: [
    JwtModule.registerAsync({
      imports: [ConfigModule]
      useFactory: async (configService: ConfigService) => {
        return {
          secret: configService.get<string>('JWT_SECRET'),
        };
      },
      inject: [ConfigService],
    }),
  ],
})

다음과 같이 빈 문자열로 연결할 경우에만 사용할 수 있습니다.

"" + process.env.JWT_KEY

로 .JWTServicey의 AuthModule를 할 때 것 JWTModule.

전에 먹었던 것:

@Module({
      imports: [
        PassportModule,
        JwtModule.registerAsync({
          imports: [ConfigModule],
          inject: [ConfigService],
          useFactory: (configService: ConfigService) => {
            const authConfig = configService.get<AuthenticationConfig>(
              PathNames.AUTH,
            );
            return {
              secret: authConfig.accessToken.secret,
              signOptions: {
                expiresIn: authConfig.accessToken.expiryTime,
              },
            };
          },
        }),
      ],
      providers: [
        AuthService,
        UsersService,
        PrismaService,
        AuthResolver,
        // this was the problem
        JwtService,
        JWTStrategy,
      ],
      exports: [AuthService],
    })
    export class AuthModule {}

process.env를 제거하기만 하면 됩니다.JWT_KEY 및 "비밀 키 사용" ES6 String Literals로 대체

${process.env.JWT_SECRET_KEY}

이것은 저를 위해 해결해 줍니다.

합니까?process.env.JWT_KEY유효한 값이 있습니까?그렇다고 생각합니다.undefined아니면null.

require('dotenv').config()를 server.js 파일 상단에 입력하면 해결됩니다.

이 메시지는 제가 E2E 테스트를 실행하고 있을 때에만 보내진 것입니다.제 경우에는 그것을 고치기 위한 비밀 옵션으로 명시적으로 설정해야 했습니다.

this.jwtService.sign(tokenPayload, { secret: `${process.env.JWT_SECRET}` });

process.env를 제거했습니다.JWT_KEY 및 "비밀"로 대체하고 정상 작동합니다.

이거 해보세요, 저한테 효과가 있어요. " + process.env.JWT_KEY

  1. 따옴표 를 추가하고 합니다를 합니다.${process.env.SECRET_KEY}안에
  2. 또한 설치 후 cross-env 패키지를 사용하는 것을 권장합니다. 이 패키지는 환경변수 .development.env and .production.env로 2개의 파일을 만들 수 있습니다.

하려면 다음과 같이 하십시오.cross-env만 하면 .package.json "scripts"드:

"start": "cross-env NODE_ENV = production nest start",
"start:dev": "cross-env NODE_ENV = development nest start --watch"

그것은 nestjs를 위한 것입니다.

이에 동참하기 위해 제가 사용하려던 키의 내용 때문에 이 오류가 발생하고 있음을 알게 되었습니다.저는 이러한 문자열에 대해 "비밀번호 생성기"를 정기적으로 사용하고 있으며, 이를 사용하기 위해 다음과 같은 정보를 제공했습니다.

<B#LCK$^\7(T^fuaQemeR&6s:#@AAwe@?T,c'=+kxT?euCP27R/D=uRm893$=^_h^f={c.)MD#[%zg}$K8_D#D-_/ytb2?Q> RFR(}H:Fp#{&yNFt@2Y<K\GB28unz

위의 내용이 백틱 또는 음성 표시 사이에 배치되면 문자열로 구문 분석할 수 없으므로 위에서 설명한 것처럼 이 오류를 발생시킵니다.

추가적인 디버깅 단계로 우선 키를 백틱이나 괄호로 감싸서 구문 분석 불가능한 문자열이 문제가 되지 않도록 해야 합니다.

와 같은 으로 하는 하려고 할 수도 .require("dotenv").config({path: '/path_to_env_file'});

저도 같은 문제가 있었습니다. 문제는 dotenv 패키지를 포함하지 않았다는 것을 알게 되었습니다.

그렇게

import * as dotenv from 'dotenv';

그다음에 집어넣습니다.dotenv.config()다른

1단계: dotenv 설치

2단계: app.js로 가져오기:

const dotenv = require("dotenv");

3단계:

dotenv.config(`${process.env.SECRET_KEY}`);

당신의 문제는 해결될 것입니다.

합니다를 해 보세요.process.env.JWT_KEY정의:

console.log(process.env.JWT_KEY)

이 문제는 뒷전에 있습니다.init.js 파일 생성을 해결하려면 process.env에 내 구성을 추가하고 index.js 파일을 요구합니다.

const config = require(`<path of config json file>`)
process.env = { ...process.env, ...config }
require('./index')

그런 다음 init.js를 웹팩의 엔트리 인덱스로 가져옵니다.

에는.process.env.JWT_SECRET_KEY.replace(/\\n/g, "\n")완벽하게 잘 작동했습니다.과 firebase가 .env를 사용하는 그리고 그들은.replace(/\\n/g, "\n")키를 파싱합니다.

이 .'' + 의 JWT으로써 을 사용할 수 있습니다.${process.env.YOUR_JWT} 하면 이렇게 하면 오류가 해결되지만 근본적인 문제는 해결되지 않습니다.

문제는 사실 dotenv가 당신이 읽으려는 당신의 모듈 코드 에 호출되고 있다는 것입니다.process.env,process.env.ANYTHING_HERE아직 dotenv에 의해 인구가 채워지지 않았을 겁니다.

아마도 진입점 파일(즉, 진입점 파일)에 있을 것입니다.main.ts요.import위에app.module도트엔보르네스트의 포장지에 전화하기 전에 말입니다

은 입니다를 입니다.main.tsrequire('dotenv').config({ path: './.env' })또는 env를 부트스트랩하고 다른 파일을 가져오기 에 이 작업을 수행합니다.그래야 당신의 수입품들이process.env실행하기 전에 사용자 환경 변수로 채워집니다.

를 로 'undefined'왜냐하면 당신이 실제로 하고 있는 일은 빈 문자열이 존재하기 전에 당신의 비밀을 위한 env 변수와 연결하는 것이기 때문입니다.오류는 해결하지만 구성 파일에서 원하는 비밀은 분명히 아닙니다.

다른 환경 변수에 대해서도 이 문제를 해결하지 못하고 있으므로 이 문제를 이렇게 해결하는 것은 좋지 않습니다.이전이 아닌 이후에 포함되기 때문에 모듈이 필요한 곳에서는 여전히 사용할 수 없습니다. 따라서 프로젝트에서 환경 변수가 정의되지 않은 다른 문제가 발생할 가능성이 높습니다.

지금까지 동일한 문제에 직면했기 때문에 해결책은 간단했습니다.

가져오기 - 또는 가져오기를 잊지 마십시오 - :) AppModule에 ConfigModule을 입력합니다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
  ],
  controllers: [AppController],
  providers: [
    AppService,
  ],
})
export class AppModule {}

추가해야 합니다.JwtModule.Register반대하다, 반대하다, 반대하다, 반대하다, 반대하다, 반대하다, 반대.auth.module.ts 안 돼요.app.module.ts

아래와 같은 모양인데요,

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UsersModule } from '../users/users.module';
import { JwtModule } from '@nestjs/jwt';
import { AuthController } from './auth.controller';
import { jwtConstants } from './constants';

@Module({
  imports: [
    UsersModule,
    JwtModule.register({
      global: true,
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService],
  controllers: [AuthController],
  exports: [AuthService],
})
export class AuthModule {}

참고: 보다 명확한 정보를 얻으려면 https://docs.nestjs.com/security/authentication 을 다시 참조하십시오.

토큰을 교체할 때 뒤에 있는 다음 것을 잡으십시오.TICKS. 이 신텍스는 나한테 효과가 있었어요.

${process.env.JWT_SECRET_KEY}

아마 2.env 파일(개발용 및 제작용)을 사용할 것입니다.예를 들어, 당신은 다음을 사용합니다.cross-env NODE_ENV=developmentjson 의 json 파일 꾸러미로"start:dev"하는 것을 만약 그것이 사실이라면, 추가하는 것을 잊지 마세요.

ConfigModule.forRoot({
    envFilePath: `.${process.env.NODE_ENV}.env`
}),

모듈 파일에 다음을(를 입력합니다.

@Module({
imports: [
  PassportModule,
  ConfigModule.forRoot({
    envFilePath: `.${process.env.NODE_ENV}.env`
}),
  JwtModule.register({
    secret: process.env.JWT_KEY,
    signOptions: { 
      expiresIn: '1h' 
    },
  }),
],
providers: [AuthService, LocalStrategy, JwtStrategy],
exports: [AuthService]
})
export class AuthModule {}

그러면 클래스 JwtStrategy와 다른 클래스에 파일을 추가할 필요가 없습니다.

${process.env.JWT_SECRET_KEY}module에 넣음으로써 제게 효과가 있었습니다.

Use the "secret" in place of "process.env.JWT_KEY"

위의 코드(이미지)를 사용하여 문제를 해결합니다.

auth.js.에서 .env 파일에 액세스할 수 없기 때문에 process.env를 쓰지 마십시오.이 대신 JWT_KEY는 한 개의 따옴표로 임의의 문자열을 작성합니다.예: '내가 프로그래머다'

오류:

const token = jwt.sign({_id:user._id}, process.env.SECRET)

올바른 코드:

const token = jwt.sign({_id:user._id},'iamtryingtoaddsome')

언급URL : https://stackoverflow.com/questions/58673430/error-secretorprivatekey-must-have-a-value

반응형