首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NestJS JWT策略需要密钥或密钥

基础概念

NestJS 是一个用于构建高效、可扩展 Node.js 服务器端应用程序的框架。它使用现代 JavaScript 或 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。

在 NestJS 中,JWT 策略通常用于身份验证和授权。它允许你验证传入请求中的 JWT,以确保用户已通过身份验证并具有访问特定资源的权限。

相关优势

  1. 安全性:JWT 通过数字签名确保数据的完整性和真实性。
  2. 无状态性:服务器不需要存储会话信息,因为所有必要的信息都包含在 JWT 中。
  3. 跨域支持:JWT 可以轻松地在不同的域之间传递。
  4. 灵活性:可以自定义 JWT 的有效负载,以满足特定的应用需求。

类型

NestJS 中的 JWT 策略主要有两种类型:

  1. 对称密钥策略:使用相同的密钥进行签名和验证。
  2. 非对称密钥策略:使用公钥进行验证,私钥进行签名。

应用场景

JWT 策略广泛应用于需要身份验证和授权的 Web 应用程序,如:

  • 用户登录和会话管理
  • API 访问控制
  • 单点登录(SSO)

问题及解决方案

为什么 NestJS JWT 策略需要密钥或密钥?

NestJS JWT 策略需要密钥或密钥对来签名和验证 JWT。这是因为 JWT 的安全性依赖于数字签名,而数字签名需要使用密钥。

  • 对称密钥:如果你使用对称密钥策略,那么同一个密钥将用于签名和验证 JWT。这要求服务器和客户端都安全地存储这个密钥。
  • 非对称密钥:如果你使用非对称密钥策略,那么将使用私钥对 JWT 进行签名,而公钥将用于验证签名。这提供了更高的安全性,因为私钥可以安全地存储在服务器上,而公钥可以公开分发。

如何解决密钥问题?

  1. 生成密钥:你可以使用 Node.js 的 crypto 模块或其他工具生成对称密钥或密钥对。

示例(生成对称密钥):

代码语言:txt
复制
const crypto = require('crypto');

const secretKey = crypto.randomBytes(32).toString('hex');
console.log(secretKey);

示例(生成非对称密钥对):

代码语言:txt
复制
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' }));
  1. 配置 NestJS 应用程序:在 NestJS 应用程序中配置 JWT 策略时,提供生成的密钥或密钥对。

示例(对称密钥策略):

代码语言:txt
复制
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 };
  }
}

示例(非对称密钥策略):

代码语言:txt
复制
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 };
  }
}

注意:在实际应用中,请确保将密钥或密钥对安全地存储在环境变量或安全的配置文件中,而不是直接硬编码在代码中。

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【云原生攻防研究】Istio访问授权再曝高危漏洞

    在过去两年,以Istio为代表的Service Mesh的问世因其出色的架构设计及火热的开源社区在业界迅速聚集了一批拥簇者,BAT等大厂先后也发布了自己的Service Mesh落地方案并在生产环境中部署运行。Service Mesh不仅可以降低应用变更过程中因为耦合产生的冲突(传统单体架构应用程序代码与应用管理代码紧耦合),也使得每个服务都可以有自己的团队从而独立进行运维。在给技术人员带来这些好处的同时,Istio的安全问题也令人堪忧,正如人们所看到的,微服务由于将单体架构拆分为众多的服务,每个服务都需要访问控制和认证授权,这些威胁无疑增加了安全防护的难度。Istio在去年一月份和九月份相继曝出三个未授权访问漏洞(CVE-2019-12243、CVE-2019-12995、CVE-2019-14993)[12],其中CVE-2019-12995和CVE-2019-14993均与Istio的JWT机制相关,看来攻击者似乎对JWT情有独钟,在今年2月4日,由Aspen Mesh公司的一名员工发现并提出Istio的JWT认证机制再次出现服务间未经授权访问的Bug, 并最终提交了CVE,CVSS机构也将此CVE最终评分为9.0[6],可见此漏洞之严重性。

    02
    领券