NestJS 是一个用于构建高效、可扩展 Node.js 服务器端应用程序的框架。它使用现代 JavaScript 或 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。
在 NestJS 中,JWT 策略通常用于身份验证和授权。它允许你验证传入请求中的 JWT,以确保用户已通过身份验证并具有访问特定资源的权限。
NestJS 中的 JWT 策略主要有两种类型:
JWT 策略广泛应用于需要身份验证和授权的 Web 应用程序,如:
NestJS JWT 策略需要密钥或密钥对来签名和验证 JWT。这是因为 JWT 的安全性依赖于数字签名,而数字签名需要使用密钥。
crypto
模块或其他工具生成对称密钥或密钥对。示例(生成对称密钥):
const crypto = require('crypto');
const secretKey = crypto.randomBytes(32).toString('hex');
console.log(secretKey);
示例(生成非对称密钥对):
const crypto = require('crypto');
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
});
console.log(publicKey.export({ type: 'spki', format: 'pem' }));
console.log(privateKey.export({ type: 'pkcs8', format: 'pem' }));
示例(对称密钥策略):
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'your-secret-key', // 使用生成的密钥
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
示例(非对称密钥策略):
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'your-public-key', // 使用生成的公钥
privateKey: 'your-private-key', // 使用生成的私钥(仅用于签名,不在此处暴露)
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}
注意:在实际应用中,请确保将密钥或密钥对安全地存储在环境变量或安全的配置文件中,而不是直接硬编码在代码中。
领取专属 10元无门槛券
手把手带您无忧上云