Не удалось получить секрет JWT dotenv "Ошибка: secretOrPrivateKey должен иметь значение"
Я пытаюсь защитить свое приложение, скрывая секретный ключ JWT в файле dotenv, хранящемся локально в корне приложения, но документация мне недостаточно понятна, и я продолжаю получать эту ошибку при запуске тестов:
console.error
Error: secretOrPrivateKey must have a value
at Object.module.exports [as sign] (/Users/amehmeto/HeroesJobs/BFF/bff-candidates/node_modules/jsonwebtoken/sign.js:107:20)
at JwtService.sign (/Users/amehmeto/HeroesJobs/BFF/bff-candidates/node_modules/@nestjs/jwt/dist/jwt.service.js:27:20)
at AuthService.generateToken (/Users/amehmeto/HeroesJobs/BFF/bff-candidates/src/auth/auth.service.ts:62:37)
at AuthService.verifySmsCode (/Users/amehmeto/HeroesJobs/BFF/bff-candidates/src/auth/auth.service.ts:49:19)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at Object.<anonymous> (/Users/amehmeto/HeroesJobs/BFF/bff-candidates/src/auth/auth.service.spec.ts:83:30)
49 | return this.generateToken(candidateId)
50 | } catch (e) {
> 51 | console.error(e)
| ^
52 | throw new HttpException(
53 | ResponseMessage.INVALID_CODE,
54 | HttpStatus.FORBIDDEN
at AuthService.verifySmsCode (auth/auth.service.ts:51:15)
at Object.<anonymous> (auth/auth.service.spec.ts:83:30)
Здесь
.env
:
JWT_SECRET=secretKey
Здесь
src/app.module.ts
:
import { Module } from '@nestjs/common'
import { StatusModule } from './status/status.module'
import { CitiesModule } from './cities/cities.module'
import { PopupModule } from './popup/popup.module'
import { CandidateModule } from './candidate/candidate.module'
import { NotificationModule } from './notification/notification.module'
import { ChatModule } from './chat/chat.module'
import { AuthModule } from './auth/auth.module'
import { SkillInviteModule } from './skill-invite/skill-invite.module'
import { ConfigModule } from '@nestjs/config'
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
StatusModule,
CitiesModule,
PopupModule,
CandidateModule,
NotificationModule,
ChatModule,
AuthModule,
SkillInviteModule,
],
})
export class AppModule {}
Тестовый файл:
describe('AuthService', () => {
let service: AuthService
let authRepository: AuthRepository
let authGateway: AuthGateway
let jwtService: JwtService
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET,
}),
],
providers: [AuthService, AuthRepository, AuthGateway],
}).compile()
service = module.get<AuthService>(AuthService)
authRepository = module.get<AuthRepository>(AuthRepository)
authGateway = module.get<AuthGateway>(AuthGateway)
jwtService = module.get<JwtService>(JwtService)
})
it('should be defined', () => {
expect(service).toBeDefined()
})
[...]
it('should generate a token that expires within one hour when code is valid', async () => {
const payload = { candidateId: '1' }
const verifyResponse = await service.verifySmsCode(phoneNumber, code)
expect(verifyResponse).toHaveProperty(
'access_token',
jwtService.sign(payload)
)
expect(verifyResponse).toHaveProperty('expires_in', 1000 * 60 * 60)
})
и, наконец, тестируемый код:
async verifySmsCode(
phoneNumber: string,
code: string
): Promise<VerifyResponseObject> {
try {
const candidateId = await this.authRepository.verifySmsCode(
phoneNumber,
code
)
return this.generateToken(candidateId)
} catch (e) {
console.error(e)
throw new HttpException(
ResponseMessage.INVALID_CODE,
HttpStatus.FORBIDDEN
)
}
}
2 ответа
Вы должны импортировать dotenv
библиотеки и настроить ее, прежде чем можно будет использовать переменные среды, определенные в
.env
. Добавление
require('dotenv').config()
к
main.ts
решит вашу проблему.
Думаю, это можно исправить, импортировав
ConfigModule
к
TestingModule
в вашем модульном тесте:
const module: TestingModule = await Test.createTestingModule({
imports: [ConfigModule.forRoot()],
providers: [AuthService, AuthRepository, AuthGateway],
}).compile()