오류: 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"
}
}
애플리케이션에서 환경 변수를 제대로 읽을 수 없는 것 같습니다.
어떤 패키지를 사용하여 환경 변수를 로드하는지 모르겠지만 가장 간단한 방법은 dotenv 패키지를 사용하는 것입니다.
npm i dotenv로 설치한 후 다음과 같이 응용프로그램 메인 파일로 최대한 빨리 가져옵니다.
require("dotenv").config();
이 컨텐츠를 사용하여 응용 프로그램 루트 폴더에 .env 파일을 만듭니다(형식이 key=value임을 알 수 있음).
MYSQL=jllgshllWEUJHGHYJkjsfjds90
JWT_KEY=secret
그러면 이미 했던 것처럼 해당 값에 액세스할 수 있습니다.
process.env.JWT_KEY
.env 파일:
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
로 .JWTService
y의 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
- 따옴표 를 추가하고 합니다를 합니다.
${process.env.SECRET_KEY}
안에 - 또한 설치 후 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.ts
require('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=development
json 의 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에 넣음으로써 제게 효과가 있었습니다.
위의 코드(이미지)를 사용하여 문제를 해결합니다.
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
'prosource' 카테고리의 다른 글
MySQL에서 쿼리가 인덱스를 사용하도록 강제하는 방법은 무엇입니까? (0) | 2023.09.20 |
---|---|
Angular uibModal, Resolve, 알 수 없는 공급자 (0) | 2023.09.20 |
Galera: SSL을 사용한 복제 (0) | 2023.09.20 |
MYSQL - 선택 및 구문 분석 (0) | 2023.09.20 |
DB Connection 매개변수를 주전자에 전달 PDI 테이블 입력 단계를 Excel에서 동적으로 수행 (0) | 2023.09.20 |