Syx*_*kno 4 javascript node.js jwt nestjs dotenv
我正在开发一个 NestJS 项目,我需要使用 JWT 进行.env配置。它生成令牌,但当尝试访问安全 url(带有授权标头)时,它仅返回未经授权的消息。
jwt.strategy.ts
import { Injectable, UnauthorizedException, Logger } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { AuthService } from './auth.service';
import { JwtPayload } from './interfaces/jwt-payload.interface';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET_KEY,
});
}
async validate(payload: JwtPayload) {
const user = await this.authService.validateUser(payload);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}Run Code Online (Sandbox Code Playgroud)
auth.module.ts
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.registerAsync({
useFactory: async () => ({
secretOrPrivateKey: process.env.JWT_SECRET_KEY,
signOptions: {
expiresIn: process.env.JWT_EXPIRATION_TIME,
},
}),
}),
],
providers: [AuthService, JwtStrategy],
controllers: [AuthController],
})
export class AuthModule {}Run Code Online (Sandbox Code Playgroud)
主要.ts
import { NestFactory } from '@nestjs/core';
import * as dotenv from 'dotenv';
import { ApiModule } from './api/api.module';
import { Logger } from '@nestjs/common';
async function bootstrap() {
dotenv.config({ path: './.env'});
const app = await NestFactory.create(ApiModule);
const port = process.env.APP_PORT;
await app.listen(port);
Logger.log(`Server started on http://localhost:${port}`);
}
bootstrap();Run Code Online (Sandbox Code Playgroud)
看起来不适JwtModule.registerAsync用于环境变量。我尝试过很多事情但总是失败。如果我更改静态数据的环境变量auth.module.ts,那么它就可以正常工作。像这样的东西:
secretOrPrivateKey: 'secretKey',
signOptions: {
expiresIn: 3600,
},
Run Code Online (Sandbox Code Playgroud)
更新 项目结构
- src
- api
- auth
- interfaces
jwt-payload.interface.ts
auth.controller.ts
auth.module.ts
auth.service.ts
jwt.strategy.ts
index.ts
api.module.ts
index.ts
main.ts
- test
.env
Run Code Online (Sandbox Code Playgroud)
我的 main.ts 现在看起来像这样。
secretOrPrivateKey: 'secretKey',
signOptions: {
expiresIn: 3600,
},
Run Code Online (Sandbox Code Playgroud)
您会看到 my.env位于项目的根目录中。
小智 17
如果您使用配置模块,您可以执行以下操作:
JwtModule.registerAsync({
useFactory: (config: ConfigService) => {
return {
secret: config.get<string>('JWT_SECRET_KEY'),
signOptions: {
expiresIn: config.get<string | number>('JWT_EXPIRATION_TIME'),
},
};
},
inject: [ConfigService],
}),
Run Code Online (Sandbox Code Playgroud)
我也遇到了初始化问题JwtModule,这段代码解决了它。
| 归档时间: |
|
| 查看次数: |
10318 次 |
| 最近记录: |