我有一个项目,需要实现JWT服务。我已经遵循了 Nest.js 文档。 在文件 Constants.ts 中,我导出一个对象,该对象具有密钥的秘密和值的 process.env
export const jwtConstants = () => ({
secret: process.env.SECRET_JWT,
});
这是行不通的。 我尝试过直接使用值键,并且有效。 我不知道为什么我无法访问此文件中的 env 文件。 这是我的身份验证模块:
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { UserService } from '../user/user.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from '../user/user.schema';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
JwtModule.register({
global: true,
secret: jwtConstants.secret,
signOptions: { expiresIn: '60s' },
}),
],
providers: [AuthService, UserService],
controllers: [AuthController],
})
export class AuthModule {}
我的身份验证服务
import { Injectable } from '@nestjs/common';
import { UserService } from '../user/user.service';
import { AuthDto } from './dto/auth.dto';
import { JwtService } from '@nestjs/jwt';
import * as argon2 from 'argon2';
@Injectable()
export class AuthService {
constructor(
private userService: UserService,
private jwtService: JwtService,
) {}
async signIn(authDto: AuthDto): Promise<{ access_token: string }> {
const user = await this.userService.findOne(authDto.email);
try {
if (await argon2.verify(user.password, authDto.password)) {
const payload = {
userName: user.firstName,
userLastName: user.lastName,
userPhone: user.phone,
userEmail: user.email,
};
return {
access_token: await this.jwtService.signAsync(payload),
};
} else {
console.log('doesn\t match');
}
} catch (error: any) {
console.log('doesn\t work');
}
}
}
以及我的应用程序模块与 ConfigModule.forRoot
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from '@nestjs/config';
import { UserModule } from './user/user.module';
import { CompanyModule } from './company/company.module';
import { CallForBidsModule } from './callForBids/call-for-bids.module';
import { AuthModule } from './auth/auth.module';
import { User, UserSchema } from './user/user.schema';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: '.env',
}),
MongooseModule.forRoot(process.env.MONGO_DB_URL, {
dbName: process.env.MONGO_DB_DATABASE_NAME,
auth: {
username: process.env.MONGO_DB_USERNAME,
password: process.env.MONGO_DB_PASSWORD,
},
}),
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
// feature module
UserModule,
CompanyModule,
CallForBidsModule,
AuthModule,
],
controllers: [],
providers: [],
})
export class AppModule {}
我尝试更改库并为 Nestjs 添加 dotenv 库,但得到了相同的结果。 我已尝试直接使用有效的密钥,但我需要使用 .envfile 重建项目也不起作用。
使用当前的
jwtConstants
,您应该像 jwtConstants().secret
一样访问秘密,因为它是函数导出。
但是,当您使用
@nestjs/config
时,更好的方法是使用 JwtModule.registerAsync
并将 ConfigService
注入 JwtModule
而不是依赖于 process.env
,因此请确保值来自哪里你认为他们是。这看起来像
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { UserService } from '../user/user.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from '../user/user.schema';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
JwtModule.registerAsync(
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
global: true,
secret: config.get('SECRET_JWT'),
signOptions: { expiresIn: '60s' },
}),
}),
],
providers: [AuthService, UserService],
controllers: [AuthController],
})
export class AuthModule {}
您还可以对
MongooseModule
执行类似的方法,使用 forRootAsync
注入 ConfigService
并从那里获取环境变量